├── .gitattributes
├── .gitignore
├── OrmBenchmark.Ado
├── OrmBenchmark.Ado.csproj
├── Post.cs
├── PureAdoExecuter.cs
├── PureAdoExecuterGetValues.cs
└── SqlDataReaderExtentions.cs
├── OrmBenchmark.Console.NetCore
├── OrmBenchmark.Console.NetCore.csproj
├── Program.cs
└── appsettings.json
├── OrmBenchmark.Console
├── App.config
├── OrmBenchmark.Console.csproj
├── OrmBenchmark.mdf
├── OrmBenchmark_log.ldf
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Settings.Designer.cs
│ └── Settings.settings
└── packages.config
├── OrmBenchmark.Core
├── BenchmarkResult.cs
├── Benchmarker.cs
├── IOrmExecuter.cs
├── IPost.cs
└── OrmBenchmark.Core.csproj
├── OrmBenchmark.Dapper
├── DapperBufferedExecuter.cs
├── DapperContribExecuter.cs
├── DapperExecuter.cs
├── DapperFirstOrDefaultExecuter.cs
├── OrmBenchmark.Dapper.csproj
└── Post.cs
├── OrmBenchmark.DevExpress
├── DevExpressQueryExecuter.cs
├── OrmBenchmark.DevExpress.csproj
└── Post.cs
├── OrmBenchmark.EntityFramework
├── EntityFrameworNoTrackingExecuter.cs
├── EntityFrameworkExecuter.cs
├── OrmBenchmark.EntityFramework.csproj
├── OrmBenchmarkContext.NetCore.cs
├── OrmBenchmarkContext.NetFramework.cs
└── Post.cs
├── OrmBenchmark.InsightDatabase
├── InsightDatabaseExecuter.cs
├── InsightSingleDatabaseExecuter.cs
├── OrmBenchmark.InsightDatabase.csproj
└── Post.cs
├── OrmBenchmark.OrmLite
├── OrmBenchmark.OrmLite.csproj
├── OrmLiteExecuter.cs
├── OrmLiteNoQueryExecuter.cs
└── Post.cs
├── OrmBenchmark.OrmToolkit
├── AutoMapperObjectFactory.NetFramework.cs
├── OrmBenchmark.OrmToolkit.csproj
├── OrmToolkitAutoMapperExecuter.NetFramework.cs
├── OrmToolkitExecuter.cs
├── OrmToolkitNoQueryExecuter.cs
├── OrmToolkitTestExecuter.cs
└── Post.cs
├── OrmBenchmark.PetaPoco
├── OrmBenchmark.PetaPoco.csproj
├── PetaPocoExecuter.cs
├── PetaPocoFastExecuter.cs
├── PetaPocoFetchExecuter.cs
├── PetaPocoFetchFastExecuter.cs
└── Post.cs
├── OrmBenchmark.SimpleData
├── OrmBenchmark.SimpleData.csproj
└── SimpleDataExecuter.NetFramework.cs
├── OrmBenchmark.sln
└── README.md
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | [Xx]64/
19 | [Xx]86/
20 | [Bb]uild/
21 | bld/
22 | [Bb]in/
23 | [Oo]bj/
24 |
25 | # Visual Studio 2015 cache/options directory
26 | .vs/
27 | # Uncomment if you have tasks that create the project's static files in wwwroot
28 | #wwwroot/
29 |
30 | # MSTest test Results
31 | [Tt]est[Rr]esult*/
32 | [Bb]uild[Ll]og.*
33 |
34 | # NUNIT
35 | *.VisualState.xml
36 | TestResult.xml
37 |
38 | # Build Results of an ATL Project
39 | [Dd]ebugPS/
40 | [Rr]eleasePS/
41 | dlldata.c
42 |
43 | # DNX
44 | project.lock.json
45 | artifacts/
46 |
47 | *_i.c
48 | *_p.c
49 | *_i.h
50 | *.ilk
51 | *.meta
52 | *.obj
53 | *.pch
54 | *.pdb
55 | *.pgc
56 | *.pgd
57 | *.rsp
58 | *.sbr
59 | *.tlb
60 | *.tli
61 | *.tlh
62 | *.tmp
63 | *.tmp_proj
64 | *.log
65 | *.vspscc
66 | *.vssscc
67 | .builds
68 | *.pidb
69 | *.svclog
70 | *.scc
71 |
72 | # Chutzpah Test files
73 | _Chutzpah*
74 |
75 | # Visual C++ cache files
76 | ipch/
77 | *.aps
78 | *.ncb
79 | *.opendb
80 | *.opensdf
81 | *.sdf
82 | *.cachefile
83 | *.VC.db
84 |
85 | # Visual Studio profiler
86 | *.psess
87 | *.vsp
88 | *.vspx
89 | *.sap
90 |
91 | # TFS 2012 Local Workspace
92 | $tf/
93 |
94 | # Guidance Automation Toolkit
95 | *.gpState
96 |
97 | # ReSharper is a .NET coding add-in
98 | _ReSharper*/
99 | *.[Rr]e[Ss]harper
100 | *.DotSettings.user
101 |
102 | # JustCode is a .NET coding add-in
103 | .JustCode
104 |
105 | # TeamCity is a build add-in
106 | _TeamCity*
107 |
108 | # DotCover is a Code Coverage Tool
109 | *.dotCover
110 |
111 | # NCrunch
112 | _NCrunch_*
113 | .*crunch*.local.xml
114 | nCrunchTemp_*
115 |
116 | # MightyMoose
117 | *.mm.*
118 | AutoTest.Net/
119 |
120 | # Web workbench (sass)
121 | .sass-cache/
122 |
123 | # Installshield output folder
124 | [Ee]xpress/
125 |
126 | # DocProject is a documentation generator add-in
127 | DocProject/buildhelp/
128 | DocProject/Help/*.HxT
129 | DocProject/Help/*.HxC
130 | DocProject/Help/*.hhc
131 | DocProject/Help/*.hhk
132 | DocProject/Help/*.hhp
133 | DocProject/Help/Html2
134 | DocProject/Help/html
135 |
136 | # Click-Once directory
137 | publish/
138 |
139 | # Publish Web Output
140 | *.[Pp]ublish.xml
141 | *.azurePubxml
142 |
143 | # TODO: Un-comment the next line if you do not want to checkin
144 | # your web deploy settings because they may include unencrypted
145 | # passwords
146 | #*.pubxml
147 | *.publishproj
148 |
149 | # NuGet Packages
150 | *.nupkg
151 | # The packages folder can be ignored because of Package Restore
152 | **/packages/*
153 | # except build/, which is used as an MSBuild target.
154 | !**/packages/build/
155 | # Uncomment if necessary however generally it will be regenerated when needed
156 | #!**/packages/repositories.config
157 | # NuGet v3's project.json files produces more ignoreable files
158 | *.nuget.props
159 | *.nuget.targets
160 |
161 | # Microsoft Azure Build Output
162 | csx/
163 | *.build.csdef
164 |
165 | # Microsoft Azure Emulator
166 | ecf/
167 | rcf/
168 |
169 | # Windows Store app package directory
170 | AppPackages/
171 | BundleArtifacts/
172 |
173 | # Visual Studio cache files
174 | # files ending in .cache can be ignored
175 | *.[Cc]ache
176 | # but keep track of directories ending in .cache
177 | !*.[Cc]ache/
178 |
179 | # Others
180 | ClientBin/
181 | [Ss]tyle[Cc]op.*
182 | ~$*
183 | *~
184 | *.dbmdl
185 | *.dbproj.schemaview
186 | *.pfx
187 | *.publishsettings
188 | node_modules/
189 | orleans.codegen.cs
190 |
191 | # RIA/Silverlight projects
192 | Generated_Code/
193 |
194 | # Backup & report files from converting an old project file
195 | # to a newer Visual Studio version. Backup files are not needed,
196 | # because we have git ;-)
197 | _UpgradeReport_Files/
198 | Backup*/
199 | UpgradeLog*.XML
200 | UpgradeLog*.htm
201 |
202 | # SQL Server files
203 | *.mdf
204 | *.ldf
205 |
206 | # Business Intelligence projects
207 | *.rdl.data
208 | *.bim.layout
209 | *.bim_*.settings
210 |
211 | # Microsoft Fakes
212 | FakesAssemblies/
213 |
214 | # GhostDoc plugin setting file
215 | *.GhostDoc.xml
216 |
217 | # Node.js Tools for Visual Studio
218 | .ntvs_analysis.dat
219 |
220 | # Visual Studio 6 build log
221 | *.plg
222 |
223 | # Visual Studio 6 workspace options file
224 | *.opt
225 |
226 | # Visual Studio LightSwitch build output
227 | **/*.HTMLClient/GeneratedArtifacts
228 | **/*.DesktopClient/GeneratedArtifacts
229 | **/*.DesktopClient/ModelManifest.xml
230 | **/*.Server/GeneratedArtifacts
231 | **/*.Server/ModelManifest.xml
232 | _Pvt_Extensions
233 |
234 | # LightSwitch generated files
235 | GeneratedArtifacts/
236 | ModelManifest.xml
237 |
238 | # Paket dependency manager
239 | .paket/paket.exe
240 |
241 | # FAKE - F# Make
242 | .fake/
243 |
--------------------------------------------------------------------------------
/OrmBenchmark.Ado/OrmBenchmark.Ado.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.Ado
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | NETCORE;NETSTANDARD;NETSTANDARD2_0
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | NET46;NETFULL
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/OrmBenchmark.Ado/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 |
4 | namespace OrmBenchmark.Ado
5 | {
6 | public class Post : IPost
7 | {
8 | public int Id { get; set; }
9 | public string Text { get; set; }
10 | public DateTime CreationDate { get; set; }
11 | public DateTime LastChangeDate { get; set; }
12 | public int? Counter1 { get; set; }
13 | public int? Counter2 { get; set; }
14 | public int? Counter3 { get; set; }
15 | public int? Counter4 { get; set; }
16 | public int? Counter5 { get; set; }
17 | public int? Counter6 { get; set; }
18 | public int? Counter7 { get; set; }
19 | public int? Counter8 { get; set; }
20 | public int? Counter9 { get; set; }
21 |
22 | //public int NotExistColumn { get; set; }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/OrmBenchmark.Ado/PureAdoExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data.SqlClient;
4 | using System.Text;
5 | using OrmBenchmark.Core;
6 | using System.Dynamic;
7 |
8 | namespace OrmBenchmark.Ado
9 | {
10 | public class PureAdoExecuter : IOrmExecuter
11 | {
12 | SqlConnection conn;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "ADO (Pure)";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | conn = new SqlConnection(connectionStrong);
25 | conn.Open();
26 | }
27 | public IPost GetItemAsObject(int Id)
28 | {
29 | var cmd = conn.CreateCommand();
30 | cmd.CommandText = @"select * from Posts where Id = @Id";
31 | var idParam = cmd.Parameters.Add("@Id", System.Data.SqlDbType.Int);
32 | idParam.Value = Id;
33 |
34 | Post obj;
35 | using (var reader = cmd.ExecuteReader())
36 | {
37 | reader.Read();
38 | obj = new Post
39 | {
40 | Id = reader.GetInt32(0),
41 | Text = reader.GetNullableString(1),
42 | CreationDate = reader.GetDateTime(2),
43 | LastChangeDate = reader.GetDateTime(3),
44 | Counter1 = reader.GetNullableValue(4),
45 | Counter2 = reader.GetNullableValue(5),
46 | Counter3 = reader.GetNullableValue(6),
47 | Counter4 = reader.GetNullableValue(7),
48 | Counter5 = reader.GetNullableValue(8),
49 | Counter6 = reader.GetNullableValue(9),
50 | Counter7 = reader.GetNullableValue(10),
51 | Counter8 = reader.GetNullableValue(11),
52 | Counter9 = reader.GetNullableValue(12),
53 | };
54 | }
55 |
56 | return obj;
57 | }
58 |
59 | public dynamic GetItemAsDynamic(int Id)
60 | {
61 | return null;
62 |
63 | var cmd = conn.CreateCommand();
64 | cmd.CommandText = @"select * from Posts where Id = @Id";
65 | var idParam = cmd.Parameters.Add("@Id", System.Data.SqlDbType.Int);
66 | idParam.Value = Id;
67 |
68 | dynamic obj;
69 | using (var reader = cmd.ExecuteReader())
70 | {
71 | reader.Read();
72 | obj = new
73 | {
74 | Id = reader.GetInt32(0),
75 | Text = reader.GetNullableString(1),
76 | CreationDate = reader.GetDateTime(2),
77 | LastChangeDate = reader.GetDateTime(3),
78 | Counter1 = reader.GetNullableValue(4),
79 | Counter2 = reader.GetNullableValue(5),
80 | Counter3 = reader.GetNullableValue(6),
81 | Counter4 = reader.GetNullableValue(7),
82 | Counter5 = reader.GetNullableValue(8),
83 | Counter6 = reader.GetNullableValue(9),
84 | Counter7 = reader.GetNullableValue(10),
85 | Counter8 = reader.GetNullableValue(11),
86 | Counter9 = reader.GetNullableValue(12),
87 | };
88 | }
89 |
90 | return obj;
91 | }
92 |
93 | public IList GetAllItemsAsObject()
94 | {
95 | var cmd = conn.CreateCommand();
96 | cmd.CommandText = @"select * from Posts";
97 |
98 | List list = new List();
99 | using (var reader = cmd.ExecuteReader())
100 | {
101 | while (reader.Read())
102 | {
103 | Post obj = new Post
104 | {
105 | Id = reader.GetInt32(0),
106 | Text = reader.GetNullableString(1),
107 | CreationDate = reader.GetDateTime(2),
108 | LastChangeDate = reader.GetDateTime(3),
109 | Counter1 = reader.GetNullableValue(4),
110 | Counter2 = reader.GetNullableValue(5),
111 | Counter3 = reader.GetNullableValue(6),
112 | Counter4 = reader.GetNullableValue(7),
113 | Counter5 = reader.GetNullableValue(8),
114 | Counter6 = reader.GetNullableValue(9),
115 | Counter7 = reader.GetNullableValue(10),
116 | Counter8 = reader.GetNullableValue(11),
117 | Counter9 = reader.GetNullableValue(12),
118 | };
119 |
120 | list.Add(obj);
121 | }
122 | }
123 |
124 | return list;
125 | }
126 |
127 | public IList GetAllItemsAsDynamic()
128 | {
129 | return null;
130 |
131 | #if NETFULL
132 | var cmd = conn.CreateCommand();
133 | cmd.CommandText = @"select * from Posts";
134 |
135 | List list = new List();
136 | using (var reader = cmd.ExecuteReader())
137 | {
138 | while (reader.Read())
139 | {
140 | dynamic obj = new
141 | {
142 | Id = reader.GetInt32(0),
143 | Text = reader.GetNullableString(1),
144 | CreationDate = reader.GetDateTime(2),
145 | LastChangeDate = reader.GetDateTime(3),
146 | Counter1 = reader.GetNullableValue(4),
147 | Counter2 = reader.GetNullableValue(5),
148 | Counter3 = reader.GetNullableValue(6),
149 | Counter4 = reader.GetNullableValue(7),
150 | Counter5 = reader.GetNullableValue(8),
151 | Counter6 = reader.GetNullableValue(9),
152 | Counter7 = reader.GetNullableValue(10),
153 | Counter8 = reader.GetNullableValue(11),
154 | Counter9 = reader.GetNullableValue(12),
155 | };
156 |
157 | list.Add(obj);
158 | }
159 | }
160 |
161 | return list;
162 | #else
163 | return null;
164 | #endif
165 | }
166 |
167 | public void Finish()
168 | {
169 | conn.Close();
170 | }
171 |
172 | }
173 | }
174 |
--------------------------------------------------------------------------------
/OrmBenchmark.Ado/PureAdoExecuterGetValues.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Data;
5 | using System.Data.SqlClient;
6 | using System.Text;
7 |
8 | namespace OrmBenchmark.Ado
9 | {
10 | public class PureAdoExecuterGetValues : IOrmExecuter
11 | {
12 | SqlConnection conn;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "ADO (Pure DataTable)";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | conn = new SqlConnection(connectionStrong);
25 | conn.Open();
26 | }
27 | public IPost GetItemAsObject(int Id)
28 | {
29 | var cmd = conn.CreateCommand();
30 | cmd.CommandText = @"select * from Posts where Id = @Id";
31 | var idParam = cmd.Parameters.Add("@Id", System.Data.SqlDbType.Int);
32 | idParam.Value = Id;
33 |
34 | DataTable table = new DataTable
35 | {
36 | Columns =
37 | {
38 | {"Id", typeof (int)},
39 | {"Text", typeof (string)},
40 | {"CreationDate", typeof (DateTime)},
41 | {"LastChangeDate", typeof (DateTime)},
42 | {"Counter1", typeof (int)},
43 | {"Counter2", typeof (int)},
44 | {"Counter3", typeof (int)},
45 | {"Counter4", typeof (int)},
46 | {"Counter5", typeof (int)},
47 | {"Counter6", typeof (int)},
48 | {"Counter7", typeof (int)},
49 | {"Counter8", typeof (int)},
50 | {"Counter9", typeof (int)},
51 | }
52 | };
53 |
54 | object[] values = new object[13];
55 | using (var reader = cmd.ExecuteReader())
56 | {
57 | reader.Read();
58 | reader.GetValues(values);
59 | table.Rows.Add(values);
60 |
61 | //obj = new {
62 | // Id = reader.GetInt32(0),
63 | // Text = reader.GetValue(1),
64 | // CreationDate = reader.GetDateTime(2),
65 | // LastChangeDate = reader.GetDateTime(3),
66 | // Counter1 = reader.GetValue(4) != DBNull.Value ? reader.GetValue(4) : null,
67 | // Counter2 = reader.GetValue(5) != DBNull.Value ? reader.GetValue(4) : null,
68 | // Counter3 = reader.GetValue(6) != DBNull.Value ? reader.GetValue(4) : null,
69 | // Counter4 = reader.GetValue(7) != DBNull.Value ? reader.GetValue(4) : null,
70 | // Counter5 = reader.GetValue(8) != DBNull.Value ? reader.GetValue(4) : null,
71 | // Counter6 = reader.GetValue(9) != DBNull.Value ? reader.GetValue(4) : null,
72 | // Counter7 = reader.GetValue(10) != DBNull.Value ? reader.GetValue(4) : null,
73 | // Counter8 = reader.GetValue(11) != DBNull.Value ? reader.GetValue(4) : null,
74 | // Counter9 = reader.GetValue(12) != DBNull.Value ? reader.GetValue(4) : null,
75 | //};
76 | }
77 |
78 | return null;
79 | }
80 |
81 | public dynamic GetItemAsDynamic(int Id)
82 | {
83 | throw new NotImplementedException();
84 | }
85 |
86 | public IList GetAllItemsAsObject()
87 | {
88 | throw new NotImplementedException();
89 | }
90 |
91 | public IList GetAllItemsAsDynamic()
92 | {
93 | throw new NotImplementedException();
94 | }
95 |
96 | public void Finish()
97 | {
98 | conn.Close();
99 | }
100 |
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/OrmBenchmark.Ado/SqlDataReaderExtentions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data.SqlClient;
4 | using System.Text;
5 |
6 | namespace OrmBenchmark.Ado
7 | {
8 | public static class SqlDataReaderExtentions
9 | {
10 | public static string GetNullableString(this SqlDataReader reader, int index)
11 | {
12 | object tmp = reader.GetValue(index);
13 | if (tmp != DBNull.Value)
14 | {
15 | return (string)tmp;
16 | }
17 | return null;
18 | }
19 |
20 | public static Nullable GetNullableValue(this SqlDataReader reader, int index) where T : struct
21 | {
22 | object tmp = reader.GetValue(index);
23 | if (tmp != DBNull.Value)
24 | {
25 | return (T)tmp;
26 | }
27 | return null;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console.NetCore/OrmBenchmark.Console.NetCore.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp2.1
6 | OrmBenchmark.ConsoleUI.NetCore
7 | OrmBenchmark.Console.NetCore
8 |
9 |
10 |
11 | false
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | Always
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | System
46 |
47 |
48 | System.Data
49 |
50 |
51 | System.Xml
52 |
53 |
54 |
55 |
56 |
57 | PreserveNewest
58 |
59 |
60 | PreserveNewest
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console.NetCore/Program.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Configuration;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Reflection;
9 | using System.Runtime.Versioning;
10 |
11 | namespace OrmBenchmark.ConsoleUI.NetCore
12 | {
13 | class Program
14 | {
15 | static void Main(string[] args)
16 | {
17 | // Set up configuration sources.
18 | var builder = new ConfigurationBuilder()
19 | .SetBasePath(Directory.GetCurrentDirectory())
20 | .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
21 | .AddEnvironmentVariables();
22 |
23 | IConfigurationRoot configuration = builder.Build();
24 |
25 | string connStringName = configuration.GetValue("DefaultConnectionStringName");
26 | string connStr = configuration.GetConnectionString(connStringName);
27 |
28 | // Set up data directory
29 | string runDir = System.AppContext.BaseDirectory;
30 | //string runDir = AppDomain.CurrentDomain.BaseDirectory;
31 | connStr = connStr.Replace("|DataDirectory|", runDir.TrimEnd('\\'));
32 |
33 | bool warmUp = false;
34 |
35 | var benchmarker = new Benchmarker(connStr, 500);
36 |
37 | benchmarker.RegisterOrmExecuter(new Ado.PureAdoExecuter());
38 | //benchmarker.RegisterOrmExecuter(new Ado.PureAdoExecuterGetValues());
39 | //benchmarker.RegisterOrmExecuter(new SimpleData.SimpleDataExecuter());
40 | benchmarker.RegisterOrmExecuter(new Dapper.DapperExecuter());
41 | benchmarker.RegisterOrmExecuter(new Dapper.DapperBufferedExecuter());
42 | benchmarker.RegisterOrmExecuter(new Dapper.DapperFirstOrDefaultExecuter());
43 | benchmarker.RegisterOrmExecuter(new Dapper.DapperContribExecuter());
44 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoExecuter());
45 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoFastExecuter());
46 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoFetchExecuter());
47 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoFetchFastExecuter());
48 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitExecuter());
49 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitNoQueryExecuter());
50 | //benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitAutoMapperExecuter());
51 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitTestExecuter());
52 | //benchmarker.RegisterOrmExecuter(new EntityFramework.EntityFrameworkExecuter());
53 | benchmarker.RegisterOrmExecuter(new EntityFramework.EntityFrameworNoTrackingExecuter());
54 | benchmarker.RegisterOrmExecuter(new InsightDatabase.InsightDatabaseExecuter());
55 | benchmarker.RegisterOrmExecuter(new InsightDatabase.InsightSingleDatabaseExecuter());
56 | benchmarker.RegisterOrmExecuter(new OrmLite.OrmLiteExecuter());
57 | benchmarker.RegisterOrmExecuter(new OrmLite.OrmLiteNoQueryExecuter());
58 | //benchmarker.RegisterOrmExecuter(new DevExpress.DevExpressQueryExecuter());
59 |
60 | Console.WriteLine("ORM Benchmark");
61 |
62 | Console.Write("\nDo you like to have a warm-up stage(y/[n])?");
63 | var str = Console.ReadLine();
64 | if (str.Trim().ToLower() == "y" || str.Trim().ToLower() == "yes")
65 | warmUp = true;
66 |
67 | var ver = Assembly.GetEntryAssembly()?.GetCustomAttribute()?.FrameworkName;
68 | Console.WriteLine(ver);
69 | Console.WriteLine("Connection string: {0}", connStr);
70 | Console.Write("\nRunning...");
71 | benchmarker.Run(warmUp);
72 | Console.WriteLine("Finished.");
73 |
74 | Console.ForegroundColor = ConsoleColor.Red;
75 |
76 | if (warmUp)
77 | {
78 | Console.WriteLine("\nPerformance of Warm-up:");
79 | ShowResults(benchmarker.resultsWarmUp, false, false);
80 | }
81 |
82 | Console.WriteLine("\nPerformance of select and map a row to a POCO object over 500 iterations:");
83 | ShowResults(benchmarker.results, true);
84 |
85 | Console.WriteLine("\nPerformance of select and map a row to a Dynamic object over 500 iterations:");
86 | ShowResults(benchmarker.resultsForDynamicItem, true);
87 |
88 | Console.WriteLine("\nPerformance of mapping 5000 rows to POCO objects in one iteration:");
89 | ShowResults(benchmarker.resultsForAllItems);
90 |
91 | Console.WriteLine("\nPerformance of mapping 5000 rows to Dynamic objects in one iteration:");
92 | ShowResults(benchmarker.resultsForAllDynamicItems);
93 |
94 | Console.ReadLine();
95 | }
96 |
97 | static void ShowResults(List results, bool showFirstRun = false, bool ignoreZeroTimes = true)
98 | {
99 | var defaultColor = Console.ForegroundColor;
100 | //Console.ForegroundColor = ConsoleColor.Gray;
101 |
102 | int i = 0;
103 | var list = results.OrderBy(o => o.ExecTime);
104 | if (ignoreZeroTimes)
105 | list = results.FindAll(o => o.ExecTime > 0).OrderBy(o => o.ExecTime);
106 |
107 | foreach (var result in list)
108 | {
109 | Console.ForegroundColor = i < 3 ? ConsoleColor.Green : ConsoleColor.Gray;
110 |
111 | if (showFirstRun)
112 | Console.WriteLine(string.Format("{0,2}-{1,-40} {2,5} ms (First run: {3,3} ms)", ++i, result.Name, result.ExecTime, result.FirstItemExecTime));
113 | else
114 | Console.WriteLine(string.Format("{0,2}-{1,-40} {2,5} ms", ++i, result.Name, result.ExecTime));
115 | }
116 |
117 | Console.ForegroundColor = defaultColor;
118 | }
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console.NetCore/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "DefaultConnectionStringName": "localDbFile",
3 | "ConnectionStrings": {
4 | "localSqlServer": "Data Source=.\\SQLEXPRESS;Initial Catalog=OrmBenchmark;Integrated Security=True",
5 | "localDbFile": "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\OrmBenchmark.mdf;Integrated Security=True"
6 | }
7 | }
--------------------------------------------------------------------------------
/OrmBenchmark.Console/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console/OrmBenchmark.Console.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}
8 | Exe
9 | Properties
10 | OrmBenchmark.ConsoleUI
11 | OrmBenchmark.Console
12 | v4.6
13 | 512
14 | true
15 | false
16 | publish\
17 | true
18 | Disk
19 | false
20 | Foreground
21 | 7
22 | Days
23 | false
24 | false
25 | true
26 | 0
27 | 1.0.0.%2a
28 | false
29 | true
30 |
31 |
32 | AnyCPU
33 | true
34 | full
35 | false
36 | bin\Debug\
37 | DEBUG;TRACE
38 | prompt
39 | 4
40 |
41 |
42 | AnyCPU
43 | pdbonly
44 | true
45 | bin\Release\
46 |
47 |
48 | prompt
49 | 4
50 |
51 |
52 |
53 | ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll
54 |
55 |
56 | ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll
57 |
58 |
59 | ..\packages\Simple.Data.Core.0.19.0.0\lib\net40\Simple.Data.dll
60 | True
61 |
62 |
63 | ..\packages\Simple.Data.Ado.0.19.0.0\lib\net40\Simple.Data.Ado.dll
64 | True
65 |
66 |
67 | ..\packages\Simple.Data.SqlServer.0.19.0.0\lib\net40\Simple.Data.SqlServer.dll
68 | True
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 | Settings.settings
87 | True
88 | True
89 |
90 |
91 |
92 |
93 | Designer
94 |
95 |
96 |
97 | SettingsSingleFileGenerator
98 | Settings.Designer.cs
99 |
100 |
101 |
102 |
103 | False
104 | Microsoft .NET Framework 4.6 %28x86 and x64%29
105 | true
106 |
107 |
108 | False
109 | .NET Framework 3.5 SP1
110 | false
111 |
112 |
113 |
114 |
115 | PreserveNewest
116 |
117 |
118 | OrmBenchmark.mdf
119 | PreserveNewest
120 |
121 |
122 |
123 |
124 | {92d3ddbf-22df-4984-bf82-8f26bf837f58}
125 | OrmBenchmark.Ado
126 |
127 |
128 | {bf582e10-662a-48f8-a52a-07fd5e9e14d9}
129 | OrmBenchmark.Core
130 |
131 |
132 | {6fef3e25-bba1-4915-aafb-66ff9c00e478}
133 | OrmBenchmark.Dapper
134 |
135 |
136 | {57cf52c7-22ec-441e-992d-eec311a8a157}
137 | OrmBenchmark.DevExpress
138 |
139 |
140 | {e08c4e3b-0689-4b6b-83a7-51fd7a722815}
141 | OrmBenchmark.EntityFramework
142 |
143 |
144 | {8125a383-320a-4f37-8518-8b0712ca8d31}
145 | OrmBenchmark.InsightDatabase
146 |
147 |
148 | {c74719fe-6e81-4591-b2bc-cc1cfecc9722}
149 | OrmBenchmark.OrmLite
150 |
151 |
152 | {fa61681e-96fc-412f-a024-ecc7478afdeb}
153 | OrmBenchmark.OrmToolkit
154 |
155 |
156 | {288636f3-963c-4a6c-8abf-99f99f4e1ca1}
157 | OrmBenchmark.PetaPoco
158 |
159 |
160 | {e66cb3ba-31d3-4c1a-863f-697fcf24b401}
161 | OrmBenchmark.SimpleData
162 |
163 |
164 |
165 |
172 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console/OrmBenchmark.mdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/InfoTechBridge/OrmBenchmark/b9aa1a3971c740670e8b0ce357b0e04bcfc68f51/OrmBenchmark.Console/OrmBenchmark.mdf
--------------------------------------------------------------------------------
/OrmBenchmark.Console/OrmBenchmark_log.ldf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/InfoTechBridge/OrmBenchmark/b9aa1a3971c740670e8b0ce357b0e04bcfc68f51/OrmBenchmark.Console/OrmBenchmark_log.ldf
--------------------------------------------------------------------------------
/OrmBenchmark.Console/Program.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Configuration;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace OrmBenchmark.ConsoleUI
10 | {
11 | class Program
12 | {
13 | static void Main(string[] args)
14 | {
15 | string connStringName = ConfigurationManager.AppSettings["DefaultConnectionStringName"];
16 | string connStr = ConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
17 |
18 | bool warmUp = false;
19 |
20 | var benchmarker = new Benchmarker(connStr, 500);
21 |
22 | benchmarker.RegisterOrmExecuter(new Ado.PureAdoExecuter());
23 | //benchmarker.RegisterOrmExecuter(new Ado.PureAdoExecuterGetValues());
24 | benchmarker.RegisterOrmExecuter(new SimpleData.SimpleDataExecuter());
25 | benchmarker.RegisterOrmExecuter(new Dapper.DapperExecuter());
26 | benchmarker.RegisterOrmExecuter(new Dapper.DapperBufferedExecuter());
27 | benchmarker.RegisterOrmExecuter(new Dapper.DapperFirstOrDefaultExecuter());
28 | benchmarker.RegisterOrmExecuter(new Dapper.DapperContribExecuter());
29 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoExecuter());
30 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoFastExecuter());
31 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoFetchExecuter());
32 | benchmarker.RegisterOrmExecuter(new PetaPoco.PetaPocoFetchFastExecuter());
33 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitExecuter());
34 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitNoQueryExecuter());
35 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitAutoMapperExecuter());
36 | benchmarker.RegisterOrmExecuter(new OrmToolkit.OrmToolkitTestExecuter());
37 | //benchmarker.RegisterOrmExecuter(new EntityFramework.EntityFrameworkExecuter());
38 | benchmarker.RegisterOrmExecuter(new EntityFramework.EntityFrameworNoTrackingExecuter());
39 | benchmarker.RegisterOrmExecuter(new InsightDatabase.InsightDatabaseExecuter());
40 | benchmarker.RegisterOrmExecuter(new InsightDatabase.InsightSingleDatabaseExecuter());
41 | benchmarker.RegisterOrmExecuter(new OrmLite.OrmLiteExecuter());
42 | benchmarker.RegisterOrmExecuter(new OrmLite.OrmLiteNoQueryExecuter());
43 | //benchmarker.RegisterOrmExecuter(new DevExpress.DevExpressQueryExecuter());
44 |
45 | Console.WriteLine("ORM Benchmark");
46 |
47 | Console.Write("\nDo you like to have a warm-up stage(y/[n])?");
48 | var str = Console.ReadLine();
49 | if (str.Trim().ToLower() == "y" || str.Trim().ToLower() == "yes")
50 | warmUp = true;
51 |
52 | string ver = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;//Environment.Version
53 | Console.WriteLine(ver);
54 | Console.WriteLine("Connection string: {0}", connStr);
55 |
56 | Console.Write("\nRunning...");
57 | benchmarker.Run(warmUp);
58 | Console.WriteLine("Finished.");
59 |
60 | Console.ForegroundColor = ConsoleColor.Red;
61 |
62 | if (warmUp)
63 | {
64 | Console.WriteLine("\nPerformance of Warm-up:");
65 | ShowResults(benchmarker.resultsWarmUp, false, false);
66 | }
67 |
68 | Console.WriteLine("\nPerformance of select and map a row to a POCO object over 500 iterations:");
69 | ShowResults(benchmarker.results, true);
70 |
71 | Console.WriteLine("\nPerformance of select and map a row to a Dynamic object over 500 iterations:");
72 | ShowResults(benchmarker.resultsForDynamicItem, true);
73 |
74 | Console.WriteLine("\nPerformance of mapping 5000 rows to POCO objects in one iteration:");
75 | ShowResults(benchmarker.resultsForAllItems);
76 |
77 | Console.WriteLine("\nPerformance of mapping 5000 rows to Dynamic objects in one iteration:");
78 | ShowResults(benchmarker.resultsForAllDynamicItems);
79 |
80 | Console.ReadLine();
81 | }
82 |
83 | static void ShowResults(List results, bool showFirstRun = false, bool ignoreZeroTimes = true)
84 | {
85 | var defaultColor = Console.ForegroundColor;
86 | //Console.ForegroundColor = ConsoleColor.Gray;
87 |
88 | int i = 0;
89 | var list = results.OrderBy(o => o.ExecTime);
90 | if(ignoreZeroTimes)
91 | list = results.FindAll(o => o.ExecTime > 0).OrderBy(o => o.ExecTime);
92 |
93 | foreach (var result in list)
94 | {
95 | Console.ForegroundColor = i < 3 ? ConsoleColor.Green : ConsoleColor.Gray;
96 |
97 | if (showFirstRun)
98 | Console.WriteLine(string.Format("{0,2}-{1,-40} {2,5} ms (First run: {3,3} ms)", ++i, result.Name, result.ExecTime, result.FirstItemExecTime));
99 | else
100 | Console.WriteLine(string.Format("{0,2}-{1,-40} {2,5} ms", ++i, result.Name, result.ExecTime));
101 | }
102 |
103 | Console.ForegroundColor = defaultColor;
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("OrmBenchmark.Console")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("OrmBenchmark.Console")]
13 | [assembly: AssemblyCopyright("Copyright © 2016")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("2b090f8b-4bfd-44b7-b8b7-d180ee919e8c")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace OrmBenchmark.ConsoleUI.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.8.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 |
26 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
28 | [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
29 | [global::System.Configuration.DefaultSettingValueAttribute("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\OrmBenchmark." +
30 | "mdf;Integrated Security=True")]
31 | public string OrmBenchmarkConnectionString {
32 | get {
33 | return ((string)(this["OrmBenchmarkConnectionString"]));
34 | }
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | <?xml version="1.0" encoding="utf-16"?>
7 | <SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
8 | <ConnectionString>Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\OrmBenchmark.mdf;Integrated Security=True</ConnectionString>
9 | <ProviderName>System.Data.SqlClient</ProviderName>
10 | </SerializableConnectionString>
11 | Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\OrmBenchmark.mdf;Integrated Security=True
12 |
13 |
14 |
--------------------------------------------------------------------------------
/OrmBenchmark.Console/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/OrmBenchmark.Core/BenchmarkResult.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace OrmBenchmark.Core
6 | {
7 | public class BenchmarkResult
8 | {
9 | public string Name { get; set; }
10 | public long FirstItemExecTime { get; set; }
11 | public long ExecTime { get; set; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/OrmBenchmark.Core/Benchmarker.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data.SqlClient;
4 | using System.Diagnostics;
5 | using System.Linq;
6 | using System.Text;
7 |
8 | namespace OrmBenchmark.Core
9 | {
10 | public class Benchmarker
11 | {
12 | private List executers { get; set; }
13 | public List results { get; set; }
14 | public List resultsForAllItems { get; set; }
15 | public List resultsForDynamicItem { get; set; }
16 | public List resultsForAllDynamicItems { get; set; }
17 | public List resultsWarmUp { get; set; }
18 | private int IterationCount { get; set; }
19 | private string ConnectionString { get; set; }
20 |
21 | public Benchmarker(string connectionString, int iterationCount)
22 | {
23 | ConnectionString = connectionString;
24 | IterationCount = iterationCount;
25 | executers = new List();
26 | results = new List();
27 | resultsForDynamicItem = new List();
28 | resultsForAllItems = new List();
29 | resultsForAllDynamicItems = new List();
30 | resultsWarmUp = new List();
31 | }
32 |
33 | public void RegisterOrmExecuter(IOrmExecuter executer)
34 | {
35 | executers.Add(executer);
36 | }
37 |
38 | public void Run(bool warmUp = false)
39 | {
40 | PrepareDatabase();
41 |
42 | results.Clear();
43 | resultsForDynamicItem.Clear();
44 | resultsForAllItems.Clear();
45 | resultsForAllDynamicItems.Clear();
46 | resultsWarmUp.Clear();
47 |
48 | var rand = new Random();
49 | foreach (IOrmExecuter executer in executers.OrderBy(ignore => rand.Next()))
50 | {
51 | executer.Init(ConnectionString);
52 |
53 | // Warm-up
54 | if (warmUp)
55 | {
56 | Stopwatch watchForWaemUp = new Stopwatch();
57 | watchForWaemUp.Start();
58 | executer.GetItemAsObject(IterationCount + 1);
59 | executer.GetItemAsDynamic(IterationCount + 1);
60 | watchForWaemUp.Stop();
61 | resultsWarmUp.Add(new BenchmarkResult { Name = executer.Name, ExecTime = watchForWaemUp.ElapsedMilliseconds });
62 | }
63 |
64 | // Object
65 | Stopwatch watch = new Stopwatch();
66 | long firstItemExecTime = 0;
67 | for (int i = 1; i <= IterationCount; i++)
68 | {
69 | watch.Start();
70 | var obj = executer.GetItemAsObject(i);
71 | watch.Stop();
72 | //if (obj?.Id != i)
73 | // throw new ApplicationException("Invalid object returned.");
74 | if (i == 1)
75 | firstItemExecTime = watch.ElapsedMilliseconds;
76 | }
77 | results.Add(new BenchmarkResult { Name = executer.Name, ExecTime = watch.ElapsedMilliseconds, FirstItemExecTime = firstItemExecTime });
78 |
79 | // Dynamic
80 | Stopwatch watchForDynamic = new Stopwatch();
81 | firstItemExecTime = 0;
82 | for (int i = 1; i <= IterationCount; i++)
83 | {
84 | watchForDynamic.Start();
85 | var dynamicObj = executer.GetItemAsDynamic(i);
86 | watchForDynamic.Stop();
87 | //if (dynamicObj?.Id != i)
88 | // throw new ApplicationException("Invalid object returned.");
89 | if (i == 1)
90 | firstItemExecTime = watchForDynamic.ElapsedMilliseconds;
91 | }
92 | resultsForDynamicItem.Add(new BenchmarkResult { Name = executer.Name, ExecTime = watchForDynamic.ElapsedMilliseconds, FirstItemExecTime = firstItemExecTime });
93 |
94 | // All Objects
95 | Stopwatch watchForAllItems = new Stopwatch();
96 | watchForAllItems.Start();
97 | executer.GetAllItemsAsObject();
98 | watchForAllItems.Stop();
99 | resultsForAllItems.Add(new BenchmarkResult { Name = executer.Name, ExecTime = watchForAllItems.ElapsedMilliseconds });
100 |
101 | // All Dynamics
102 | Stopwatch watchForAllDynamicItems = new Stopwatch();
103 | watchForAllDynamicItems.Start();
104 | executer.GetAllItemsAsDynamic();
105 | watchForAllDynamicItems.Stop();
106 | resultsForAllDynamicItems.Add(new BenchmarkResult { Name = executer.Name, ExecTime = watchForAllDynamicItems.ElapsedMilliseconds });
107 |
108 | executer.Finish();
109 | }
110 | }
111 |
112 | private void PrepareDatabase()
113 | {
114 | using (var conn = new SqlConnection(ConnectionString))
115 | {
116 | conn.Open();
117 |
118 | var cmd = conn.CreateCommand();
119 | cmd.CommandText = @"
120 | if (OBJECT_ID('Posts') is null)
121 | begin
122 | create table Posts
123 | (
124 | Id int identity primary key,
125 | [Text] varchar(max) not null,
126 | CreationDate datetime not null,
127 | LastChangeDate datetime not null,
128 | Counter1 int,
129 | Counter2 int,
130 | Counter3 int,
131 | Counter4 int,
132 | Counter5 int,
133 | Counter6 int,
134 | Counter7 int,
135 | Counter8 int,
136 | Counter9 int
137 | )
138 |
139 | set nocount on
140 |
141 | declare @i int
142 | declare @c int
143 | declare @id int
144 | set @i = 0
145 |
146 | while @i <= 5001
147 | begin
148 | insert Posts ([Text], CreationDate, LastChangeDate) values (replicate('x', 2000), GETDATE(), GETDATE())
149 | set @id = @@IDENTITY
150 |
151 | set @i = @i + 1
152 | end
153 | end";
154 |
155 | cmd.Connection = conn;
156 | cmd.ExecuteNonQuery();
157 | conn.Close();
158 | }
159 | }
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/OrmBenchmark.Core/IOrmExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace OrmBenchmark.Core
6 | {
7 | public interface IOrmExecuter
8 | {
9 | string Name { get; }
10 | void Init(string connectionStrong);
11 | IPost GetItemAsObject(int Id);
12 | dynamic GetItemAsDynamic(int Id);
13 | IList GetAllItemsAsObject();
14 | IList GetAllItemsAsDynamic();
15 | void Finish();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/OrmBenchmark.Core/IPost.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace OrmBenchmark.Core
6 | {
7 | public interface IPost
8 | {
9 | int Id { get; set; }
10 | string Text { get; set; }
11 | DateTime CreationDate { get; set; }
12 | DateTime LastChangeDate { get; set; }
13 | int? Counter1 { get; set; }
14 | int? Counter2 { get; set; }
15 | int? Counter3 { get; set; }
16 | int? Counter4 { get; set; }
17 | int? Counter5 { get; set; }
18 | int? Counter6 { get; set; }
19 | int? Counter7 { get; set; }
20 | int? Counter8 { get; set; }
21 | int? Counter9 { get; set; }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/OrmBenchmark.Core/OrmBenchmark.Core.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.Core
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | NETCORE;NETSTANDARD;NETSTANDARD2_0
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | NET46;NETFULL
38 |
39 |
40 |
--------------------------------------------------------------------------------
/OrmBenchmark.Dapper/DapperBufferedExecuter.cs:
--------------------------------------------------------------------------------
1 | using Dapper;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Linq;
7 | using System.Text;
8 |
9 | namespace OrmBenchmark.Dapper
10 | {
11 | public class DapperBufferedExecuter : IOrmExecuter
12 | {
13 | SqlConnection conn;
14 |
15 | public string Name
16 | {
17 | get
18 | {
19 | return "Dapper Query (Buffered)";
20 | }
21 | }
22 |
23 | public void Init(string connectionStrong)
24 | {
25 | conn = new SqlConnection(connectionStrong);
26 | conn.Open();
27 | }
28 |
29 | public IPost GetItemAsObject(int Id)
30 | {
31 | object param = new { Id = Id };
32 | return conn.Query("select * from Posts where Id=@Id", param, buffered: true).First();
33 | }
34 |
35 | public dynamic GetItemAsDynamic(int Id)
36 | {
37 | object param = new { Id = Id };
38 | return conn.Query("select * from Posts where Id=@Id", param, buffered: true).First();
39 | }
40 |
41 | public IList GetAllItemsAsObject()
42 | {
43 | return conn.Query("select * from Posts", null, buffered: true).ToList();
44 | }
45 |
46 | public IList GetAllItemsAsDynamic()
47 | {
48 | return conn.Query("select * from Posts", null, buffered: true).ToList();
49 | }
50 |
51 | public void Finish()
52 | {
53 | conn.Close();
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/OrmBenchmark.Dapper/DapperContribExecuter.cs:
--------------------------------------------------------------------------------
1 | using Dapper.Contrib.Extensions;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Linq;
7 | using System.Text;
8 |
9 | namespace OrmBenchmark.Dapper
10 | {
11 | public class DapperContribExecuter : IOrmExecuter
12 | {
13 | SqlConnection conn;
14 |
15 | public string Name
16 | {
17 | get
18 | {
19 | return "Dapper Contrib";
20 | }
21 | }
22 |
23 | public void Init(string connectionStrong)
24 | {
25 | conn = new SqlConnection(connectionStrong);
26 | conn.Open();
27 | }
28 |
29 | public IPost GetItemAsObject(int Id)
30 | {
31 | return conn.Get(Id);
32 | }
33 |
34 | public dynamic GetItemAsDynamic(int Id)
35 | {
36 | return null;
37 | }
38 |
39 | public IList GetAllItemsAsObject()
40 | {
41 | return conn.GetAll().ToList();
42 | }
43 |
44 | public IList GetAllItemsAsDynamic()
45 | {
46 | return null;
47 | }
48 |
49 | public void Finish()
50 | {
51 | conn.Close();
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/OrmBenchmark.Dapper/DapperExecuter.cs:
--------------------------------------------------------------------------------
1 | using Dapper;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Linq;
7 | using System.Text;
8 |
9 | namespace OrmBenchmark.Dapper
10 | {
11 | public class DapperExecuter : IOrmExecuter
12 | {
13 | SqlConnection conn;
14 |
15 | public string Name
16 | {
17 | get
18 | {
19 | return "Dapper Query (Non Buffered)";
20 | }
21 | }
22 |
23 | public void Init(string connectionStrong)
24 | {
25 | conn = new SqlConnection(connectionStrong);
26 | conn.Open();
27 | }
28 |
29 | public IPost GetItemAsObject(int Id)
30 | {
31 | object param = new { Id = Id };
32 | return conn.Query("select * from Posts where Id=@Id", param, buffered: false).First();
33 | }
34 |
35 | public dynamic GetItemAsDynamic(int Id)
36 | {
37 | object param = new { Id = Id };
38 | return conn.Query("select * from Posts where Id=@Id", param, buffered: false).First();
39 | }
40 |
41 | public IList GetAllItemsAsObject()
42 | {
43 | return conn.Query("select * from Posts", null, buffered: false).ToList();
44 | }
45 |
46 | public IList GetAllItemsAsDynamic()
47 | {
48 | return conn.Query("select * from Posts", null, buffered: false).ToList();
49 | }
50 |
51 | public void Finish()
52 | {
53 | conn.Close();
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/OrmBenchmark.Dapper/DapperFirstOrDefaultExecuter.cs:
--------------------------------------------------------------------------------
1 | using Dapper;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Text;
7 |
8 | namespace OrmBenchmark.Dapper
9 | {
10 | public class DapperFirstOrDefaultExecuter : IOrmExecuter
11 | {
12 | SqlConnection conn;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "Dapper Query (First Or Default)";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | conn = new SqlConnection(connectionStrong);
25 | conn.Open();
26 | }
27 |
28 | public IPost GetItemAsObject(int Id)
29 | {
30 | object param = new { Id = Id };
31 | return conn.QueryFirstOrDefault("select * from Posts where Id=@Id", param);
32 | }
33 |
34 | public dynamic GetItemAsDynamic(int Id)
35 | {
36 | object param = new { Id = Id };
37 | return conn.QueryFirstOrDefault("select * from Posts where Id=@Id", param);
38 | }
39 |
40 | public IList GetAllItemsAsObject()
41 | {
42 | return null;
43 | }
44 |
45 | public IList GetAllItemsAsDynamic()
46 | {
47 | return null;
48 | }
49 |
50 | public void Finish()
51 | {
52 | conn.Close();
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/OrmBenchmark.Dapper/OrmBenchmark.Dapper.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.Dapper
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | NETCORE;NETSTANDARD;NETSTANDARD2_0
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | NET46;NETFULL
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/OrmBenchmark.Dapper/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 |
4 | namespace OrmBenchmark.Dapper
5 | {
6 | public class Post : IPost
7 | {
8 | public int Id { get; set; }
9 | public string Text { get; set; }
10 | public DateTime CreationDate { get; set; }
11 | public DateTime LastChangeDate { get; set; }
12 | public int? Counter1 { get; set; }
13 | public int? Counter2 { get; set; }
14 | public int? Counter3 { get; set; }
15 | public int? Counter4 { get; set; }
16 | public int? Counter5 { get; set; }
17 | public int? Counter6 { get; set; }
18 | public int? Counter7 { get; set; }
19 | public int? Counter8 { get; set; }
20 | public int? Counter9 { get; set; }
21 |
22 | //public int NotExistColumn { get; set; }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/OrmBenchmark.DevExpress/DevExpressQueryExecuter.cs:
--------------------------------------------------------------------------------
1 | using DevExpress.Xpo;
2 | using DevExpress.Xpo.DB;
3 | using OrmBenchmark.Core;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Data;
7 | using System.Linq;
8 | using System.Text;
9 |
10 | namespace OrmBenchmark.DevExpress
11 | {
12 | public class DevExpressQueryExecuter : IOrmExecuter
13 | {
14 | //IDbConnection conn;
15 | //IDataLayer dbFactory;
16 | UnitOfWork uow;
17 |
18 | public string Name
19 | {
20 | get
21 | {
22 | return "DevExpress Xpo";
23 | }
24 | }
25 |
26 | public void Init(string connectionStrong)
27 | {
28 | XpoDefault.DataLayer = XpoDefault.GetDataLayer(connectionStrong, AutoCreateOption.SchemaAlreadyExists);
29 | uow = new UnitOfWork();
30 | }
31 |
32 | public IPost GetItemAsObject(int Id)
33 | {
34 |
35 | return uow.Query().Where(i => i.Id == Id).First();
36 | }
37 |
38 | public dynamic GetItemAsDynamic(int Id)
39 | {
40 | var q = uow.Query()
41 | .Where(i => i.Id == Id)
42 | .Select(p => new
43 | {
44 | p.Id,
45 | p.Text,
46 | p.CreationDate,
47 | p.LastChangeDate,
48 | p.Counter1,
49 | p.Counter2,
50 | p.Counter3,
51 | p.Counter4,
52 | p.Counter5,
53 | p.Counter6,
54 | p.Counter7,
55 | p.Counter8,
56 | p.Counter9
57 | });
58 |
59 | return q.Single();
60 | }
61 |
62 | public IList GetAllItemsAsObject()
63 | {
64 | return uow.Query().ToList();
65 | }
66 |
67 | public IList GetAllItemsAsDynamic()
68 | {
69 | var q = uow.Query()
70 | .Select(p => new
71 | {
72 | p.Id,
73 | p.Text,
74 | p.CreationDate,
75 | p.LastChangeDate,
76 | p.Counter1,
77 | p.Counter2,
78 | p.Counter3,
79 | p.Counter4,
80 | p.Counter5,
81 | p.Counter6,
82 | p.Counter7,
83 | p.Counter8,
84 | p.Counter9
85 | });
86 |
87 | return q.ToList();
88 | }
89 | public void Finish()
90 | {
91 |
92 | }
93 |
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/OrmBenchmark.DevExpress/OrmBenchmark.DevExpress.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | NETCORE;NETSTANDARD;NETSTANDARD2_0
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | NET46;NETFULL
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/OrmBenchmark.DevExpress/Post.cs:
--------------------------------------------------------------------------------
1 | using DevExpress.Xpo;
2 | using OrmBenchmark.Core;
3 | using System;
4 |
5 | namespace OrmBenchmark.DevExpress
6 | {
7 | [Persistent(mapTo: "Posts")]
8 | public class Post : XPLiteObject ,IPost
9 | {
10 | public Post(Session session)
11 | : base(session)
12 | {
13 | }
14 |
15 | [Key(true)]
16 |
17 | public int Id { get; set; }
18 | public string Text { get; set; }
19 | public DateTime CreationDate { get; set; }
20 | public DateTime LastChangeDate { get; set; }
21 | public int? Counter1 { get; set; }
22 | public int? Counter2 { get; set; }
23 | public int? Counter3 { get; set; }
24 | public int? Counter4 { get; set; }
25 | public int? Counter5 { get; set; }
26 | public int? Counter6 { get; set; }
27 | public int? Counter7 { get; set; }
28 | public int? Counter8 { get; set; }
29 | public int? Counter9 { get; set; }
30 | //public int NotExistColumn { get; set; }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/OrmBenchmark.EntityFramework/EntityFrameworNoTrackingExecuter.cs:
--------------------------------------------------------------------------------
1 | #if NETSTANDARD
2 | using Microsoft.EntityFrameworkCore;
3 | #endif
4 | using OrmBenchmark.Core;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Linq;
8 | using System.Text;
9 |
10 | namespace OrmBenchmark.EntityFramework
11 | {
12 | public class EntityFrameworNoTrackingExecuter : IOrmExecuter
13 | {
14 | OrmBenchmarkContext ctx;
15 |
16 | public string Name
17 | {
18 | get
19 | {
20 | return "Entity Framework (NoTracking)";
21 | }
22 | }
23 |
24 | public void Init(string connectionStrong)
25 | {
26 | ctx = new OrmBenchmarkContext(connectionStrong);
27 | }
28 |
29 | public IPost GetItemAsObject(int Id)
30 | {
31 | return ctx.Posts.AsNoTracking().Where(p => p.Id == Id) as IPost;
32 |
33 | }
34 |
35 | public dynamic GetItemAsDynamic(int Id)
36 | {
37 | return ctx.Posts.AsNoTracking().Where(p => p.Id == Id).Select(p => new {
38 | p.Id,
39 | p.Text,
40 | p.CreationDate,
41 | p.LastChangeDate,
42 | p.Counter1,
43 | p.Counter2,
44 | p.Counter3,
45 | p.Counter4,
46 | p.Counter5,
47 | p.Counter6,
48 | p.Counter7,
49 | p.Counter8,
50 | p.Counter9,
51 | });
52 | }
53 |
54 | public IList GetAllItemsAsObject()
55 | {
56 | return ctx.Posts.AsNoTracking().ToList();
57 | }
58 |
59 | public IList GetAllItemsAsDynamic()
60 | {
61 | return ctx.Posts.AsNoTracking().Select(p => new {
62 | p.Id,
63 | p.Text,
64 | p.CreationDate,
65 | p.LastChangeDate,
66 | p.Counter1,
67 | p.Counter2,
68 | p.Counter3,
69 | p.Counter4,
70 | p.Counter5,
71 | p.Counter6,
72 | p.Counter7,
73 | p.Counter8,
74 | p.Counter9,
75 | }).ToList();
76 | }
77 | public void Finish()
78 | {
79 |
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/OrmBenchmark.EntityFramework/EntityFrameworkExecuter.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 |
7 | namespace OrmBenchmark.EntityFramework
8 | {
9 | public class EntityFrameworkExecuter : IOrmExecuter
10 | {
11 | OrmBenchmarkContext ctx;
12 |
13 | public string Name
14 | {
15 | get
16 | {
17 | return "Entity Framework";
18 | }
19 | }
20 |
21 | public void Init(string connectionStrong)
22 | {
23 |
24 | ctx = new OrmBenchmarkContext(connectionStrong);
25 |
26 | }
27 |
28 | public IPost GetItemAsObject(int Id)
29 | {
30 | return ctx.Posts.Where(p => p.Id == Id) as IPost;
31 |
32 | }
33 |
34 | public dynamic GetItemAsDynamic(int Id)
35 | {
36 | return ctx.Posts.Where(p => p.Id == Id).Select(p => new {
37 | p.Id,
38 | p.Text,
39 | p.CreationDate,
40 | p.LastChangeDate,
41 | p.Counter1,
42 | p.Counter2,
43 | p.Counter3,
44 | p.Counter4,
45 | p.Counter5,
46 | p.Counter6,
47 | p.Counter7,
48 | p.Counter8,
49 | p.Counter9,
50 | });
51 | }
52 |
53 | public IList GetAllItemsAsObject()
54 | {
55 | return ctx.Posts.ToList();
56 | }
57 |
58 | public IList GetAllItemsAsDynamic()
59 | {
60 | return ctx.Posts.Select(p => new {
61 | p.Id,
62 | p.Text,
63 | p.CreationDate,
64 | p.LastChangeDate,
65 | p.Counter1,
66 | p.Counter2,
67 | p.Counter3,
68 | p.Counter4,
69 | p.Counter5,
70 | p.Counter6,
71 | p.Counter7,
72 | p.Counter8,
73 | p.Counter9,
74 | }).ToList();
75 | }
76 | public void Finish()
77 | {
78 |
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/OrmBenchmark.EntityFramework/OrmBenchmark.EntityFramework.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.EntityFramework
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | NETCORE;NETSTANDARD;NETSTANDARD2_0
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | NET46;NETFULL
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/OrmBenchmark.EntityFramework/OrmBenchmarkContext.NetCore.cs:
--------------------------------------------------------------------------------
1 | #if NETSTANDARD
2 | using Microsoft.EntityFrameworkCore;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Text;
6 |
7 | namespace OrmBenchmark.EntityFramework
8 | {
9 | class OrmBenchmarkContext : DbContext
10 | {
11 | private string ConnectionStrong;
12 |
13 | public OrmBenchmarkContext(string connectionStrong)
14 | {
15 | ConnectionStrong = connectionStrong;
16 | }
17 |
18 | public DbSet Posts { get; set; }
19 |
20 | protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
21 | {
22 | optionsBuilder.UseSqlServer(ConnectionStrong);
23 | }
24 | }
25 | }
26 | #endif
--------------------------------------------------------------------------------
/OrmBenchmark.EntityFramework/OrmBenchmarkContext.NetFramework.cs:
--------------------------------------------------------------------------------
1 | #if NETFULL
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Data.Common;
5 | using System.Data.Entity;
6 | using System.Data.Entity.Core.EntityClient;
7 | using System.Linq;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace OrmBenchmark.EntityFramework
12 | {
13 | class OrmBenchmarkContext : DbContext
14 | {
15 | public OrmBenchmarkContext(string connectionStrong)
16 | //: base(GetSqlConnection(connectionStrong), true)
17 | //: base("name=sqlServerLocal")
18 | : base(connectionStrong)
19 | {
20 |
21 |
22 | }
23 |
24 | public DbSet Posts { get; set; }
25 |
26 | private static DbConnection GetSqlConnection(string connectionStrong)
27 | {
28 | // Initialize the EntityConnectionStringBuilder.
29 | EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
30 |
31 | // Set the provider name.
32 | entityBuilder.Provider = "System.Data.SqlClient";
33 |
34 | // Set the provider-specific connection string.
35 | entityBuilder.ProviderConnectionString = connectionStrong;
36 |
37 | // Set the Metadata location.
38 | //entityBuilder.Metadata = "res://*/Models.TestModel.csdl|res://*/Models.TestModel.ssdl|res://*/Models.TestModel.msl";
39 |
40 | return new EntityConnection(entityBuilder.ToString());
41 | }
42 | }
43 | }
44 | #endif
--------------------------------------------------------------------------------
/OrmBenchmark.EntityFramework/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 | using System.ComponentModel.DataAnnotations.Schema;
4 |
5 | namespace OrmBenchmark.EntityFramework
6 | {
7 | [Table("Posts")]
8 | public class Post : IPost
9 | {
10 | public int Id { get; set; }
11 | public string Text { get; set; }
12 | public DateTime CreationDate { get; set; }
13 | public DateTime LastChangeDate { get; set; }
14 | public int? Counter1 { get; set; }
15 | public int? Counter2 { get; set; }
16 | public int? Counter3 { get; set; }
17 | public int? Counter4 { get; set; }
18 | public int? Counter5 { get; set; }
19 | public int? Counter6 { get; set; }
20 | public int? Counter7 { get; set; }
21 | public int? Counter8 { get; set; }
22 | public int? Counter9 { get; set; }
23 |
24 | //public int NotExistColumn { get; set; }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/OrmBenchmark.InsightDatabase/InsightDatabaseExecuter.cs:
--------------------------------------------------------------------------------
1 | using Insight.Database;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Linq;
7 | using System.Text;
8 |
9 | namespace OrmBenchmark.InsightDatabase
10 | {
11 | public class InsightDatabaseExecuter : IOrmExecuter
12 | {
13 | private SqlConnection conn;
14 |
15 | public string Name => "Insight Database";
16 |
17 | public void Finish()
18 | {
19 | conn.Close();
20 | }
21 |
22 | public IList GetAllItemsAsDynamic()
23 | {
24 | return conn.QuerySql("select * from Posts");
25 | }
26 |
27 | public IList GetAllItemsAsObject()
28 | {
29 | return conn.QuerySql("select * from Posts").ToList();
30 | }
31 |
32 | public dynamic GetItemAsDynamic(int Id)
33 | {
34 | object param = new { Id = Id };
35 | return conn.QuerySql("select * from Posts where Id=@Id", param).FirstOrDefault();
36 | }
37 |
38 | public IPost GetItemAsObject(int Id)
39 | {
40 | object param = new { Id = Id };
41 | return conn.QuerySql("select * from Posts where Id=@Id", param).FirstOrDefault();
42 | }
43 |
44 | public void Init(string connectionStrong)
45 | {
46 | conn = new SqlConnection(connectionStrong);
47 | SqlInsightDbProvider.RegisterProvider();
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/OrmBenchmark.InsightDatabase/InsightSingleDatabaseExecuter.cs:
--------------------------------------------------------------------------------
1 | using Insight.Database;
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Text;
7 |
8 | namespace OrmBenchmark.InsightDatabase
9 | {
10 | public class InsightSingleDatabaseExecuter : IOrmExecuter
11 | {
12 | private SqlConnection conn;
13 |
14 | public string Name => "Insight Database (Single)";
15 |
16 | public void Finish()
17 | {
18 | conn.Close();
19 | }
20 |
21 | public IList GetAllItemsAsDynamic()
22 | {
23 | return null;
24 | }
25 |
26 | public IList GetAllItemsAsObject()
27 | {
28 | return null;
29 | }
30 |
31 | public dynamic GetItemAsDynamic(int Id)
32 | {
33 | object param = new { Id = Id };
34 | return conn.SingleSql("select * from Posts where Id=@Id", param);
35 | }
36 |
37 | public IPost GetItemAsObject(int Id)
38 | {
39 | object param = new { Id = Id };
40 | return conn.SingleSql("select * from Posts where Id=@Id", param);
41 | }
42 |
43 | public void Init(string connectionStrong)
44 | {
45 | conn = new SqlConnection(connectionStrong);
46 | SqlInsightDbProvider.RegisterProvider();
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/OrmBenchmark.InsightDatabase/OrmBenchmark.InsightDatabase.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.InsightDatabase
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | NETCORE;NETSTANDARD;NETSTANDARD2_0
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | NET46;NETFULL
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/OrmBenchmark.InsightDatabase/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 |
4 | namespace OrmBenchmark.InsightDatabase
5 | {
6 | public class Post : IPost
7 | {
8 | public int Id { get; set; }
9 | public string Text { get; set; }
10 | public DateTime CreationDate { get; set; }
11 | public DateTime LastChangeDate { get; set; }
12 | public int? Counter1 { get; set; }
13 | public int? Counter2 { get; set; }
14 | public int? Counter3 { get; set; }
15 | public int? Counter4 { get; set; }
16 | public int? Counter5 { get; set; }
17 | public int? Counter6 { get; set; }
18 | public int? Counter7 { get; set; }
19 | public int? Counter8 { get; set; }
20 | public int? Counter9 { get; set; }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmLite/OrmBenchmark.OrmLite.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.OrmLite
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | NETCORE;NETSTANDARD;NETSTANDARD2_0
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | NET46;NETFULL
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmLite/OrmLiteExecuter.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using ServiceStack.OrmLite;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data;
6 | using System.Linq;
7 | using System.Text;
8 |
9 | namespace OrmBenchmark.OrmLite
10 | {
11 | public class OrmLiteExecuter : IOrmExecuter
12 | {
13 | IDbConnection conn;
14 | OrmLiteConnectionFactory dbFactory;
15 |
16 | public string Name
17 | {
18 | get
19 | {
20 | return "Orm Lite";
21 | }
22 | }
23 |
24 | public void Init(string connectionStrong)
25 | {
26 | dbFactory = new OrmLiteConnectionFactory(connectionStrong, SqlServerDialect.Provider);
27 | conn = dbFactory.Open();
28 | }
29 |
30 | public IPost GetItemAsObject(int Id)
31 | {
32 | object param = new { Id = Id };
33 | return conn.Single("select * from Posts where Id=@Id", param);
34 | }
35 |
36 | public dynamic GetItemAsDynamic(int Id)
37 | {
38 | object param = new { Id = Id };
39 | return conn.Single("select * from Posts where Id=@Id", param);
40 | }
41 |
42 | public IList GetAllItemsAsObject()
43 | {
44 | return conn.Select("select * from Posts").ToList();
45 | }
46 |
47 | public IList GetAllItemsAsDynamic()
48 | {
49 | return conn.Select("select * from Posts");
50 | }
51 | public void Finish()
52 | {
53 | conn.Close();
54 | }
55 |
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmLite/OrmLiteNoQueryExecuter.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using ServiceStack.OrmLite;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data;
6 | using System.Linq;
7 | using System.Text;
8 |
9 | namespace OrmBenchmark.OrmLite
10 | {
11 | public class OrmLiteNoQueryExecuter : IOrmExecuter
12 | {
13 | IDbConnection conn;
14 | OrmLiteConnectionFactory dbFactory;
15 |
16 | public string Name
17 | {
18 | get
19 | {
20 | return "Orm Lite (No Query)";
21 | }
22 | }
23 |
24 | public void Init(string connectionStrong)
25 | {
26 | dbFactory = new OrmLiteConnectionFactory(connectionStrong, SqlServerDialect.Provider);
27 | conn = dbFactory.Open();
28 | }
29 |
30 | public IPost GetItemAsObject(int Id)
31 | {
32 | return conn.SingleById(Id);
33 | }
34 |
35 | public dynamic GetItemAsDynamic(int Id)
36 | {
37 | var q = conn.From()
38 | .Where(p => p.Id == Id)
39 | .Select(p => new
40 | {
41 | p.Id,
42 | p.Text,
43 | p.CreationDate,
44 | p.LastChangeDate,
45 | p.Counter1,
46 | p.Counter2,
47 | p.Counter3,
48 | p.Counter4,
49 | p.Counter5,
50 | p.Counter6,
51 | p.Counter7,
52 | p.Counter8,
53 | p.Counter9
54 | });
55 |
56 | return conn.Single(q);
57 | }
58 |
59 | public IList GetAllItemsAsObject()
60 | {
61 | return conn.Select().ToList();
62 | }
63 |
64 | public IList GetAllItemsAsDynamic()
65 | {
66 | var q = conn.From()
67 | .Select(p => new
68 | {
69 | p.Id,
70 | p.Text,
71 | p.CreationDate,
72 | p.LastChangeDate,
73 | p.Counter1,
74 | p.Counter2,
75 | p.Counter3,
76 | p.Counter4,
77 | p.Counter5,
78 | p.Counter6,
79 | p.Counter7,
80 | p.Counter8,
81 | p.Counter9
82 | });
83 |
84 | return conn.Select(q);
85 | }
86 | public void Finish()
87 | {
88 | conn.Close();
89 | }
90 |
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmLite/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using ServiceStack.DataAnnotations;
3 | using System;
4 |
5 | namespace OrmBenchmark.OrmLite
6 | {
7 | [Alias("Posts")]
8 | public class Post : IPost
9 | {
10 | public int Id { get; set; }
11 | public string Text { get; set; }
12 | public DateTime CreationDate { get; set; }
13 | public DateTime LastChangeDate { get; set; }
14 | public int? Counter1 { get; set; }
15 | public int? Counter2 { get; set; }
16 | public int? Counter3 { get; set; }
17 | public int? Counter4 { get; set; }
18 | public int? Counter5 { get; set; }
19 | public int? Counter6 { get; set; }
20 | public int? Counter7 { get; set; }
21 | public int? Counter8 { get; set; }
22 | public int? Counter9 { get; set; }
23 | //public int NotExistColumn { get; set; }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/AutoMapperObjectFactory.NetFramework.cs:
--------------------------------------------------------------------------------
1 | #if NETFULL
2 | using ORMToolkit.Core.Factories;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 | using System.Data;
9 | using System.Runtime.CompilerServices;
10 | using AutoMapper;
11 | using AutoMapper.Mappers;
12 |
13 |
14 | namespace OrmBenchmark.OrmToolkit
15 | {
16 | public class AutoMapperObjectFactory : IObjectFactory1
17 | {
18 | public AutoMapperObjectFactory()
19 | {
20 | //Mapper.Initialize(cfg => { });
21 | //MapperRegistry.Mappers.Add(new DataReaderMapper());
22 |
23 | Mapper.Initialize(cfg =>
24 | {
25 | //MapperRegistry.Mappers.Add(new DataReaderMapper { YieldReturnEnabled = true });
26 | MapperRegistry.Mappers.Add(new DataReaderMapper());
27 | });
28 | }
29 |
30 | public object CreateObject(IDataReader reader, Type objectType)
31 | {
32 | throw new NotImplementedException();
33 | }
34 |
35 | public T CreateObject(IDataReader reader) where T : class, new()
36 | {
37 | throw new NotImplementedException();
38 | }
39 |
40 | public IEnumerable CreateObjects(IDataReader reader) where T : class, new()
41 | {
42 | foreach (var o in Mapper.DynamicMap>(reader))
43 | yield return o;
44 | }
45 | }
46 | }
47 | #endif
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/OrmBenchmark.OrmToolkit.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.OrmToolkit
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | NETCORE;NETSTANDARD;NETSTANDARD2_0
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | NET46;NETFULL
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/OrmToolkitAutoMapperExecuter.NetFramework.cs:
--------------------------------------------------------------------------------
1 | #if NETFULL
2 | using OrmBenchmark.Core;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Data.SqlClient;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 | using ORMToolkit.Core;
10 | using ORMToolkit.Core.Factories;
11 | using ORMToolkit.Core.CacheProvider;
12 |
13 | namespace OrmBenchmark.OrmToolkit
14 | {
15 | public class OrmToolkitAutoMapperExecuter : IOrmExecuter
16 | {
17 | SqlConnection conn;
18 | QueryOption option;
19 |
20 | public string Name
21 | {
22 | get
23 | {
24 | return "OrmToolkit (Auto Mapper)";
25 | }
26 | }
27 |
28 | public void Init(string connectionStrong)
29 | {
30 | conn = new SqlConnection(connectionStrong);
31 | conn.Open();
32 |
33 | option = new QueryOption()
34 | {
35 |
36 | };
37 |
38 | OrmToolkitSettings.ObjectFactory = new AutoMapperObjectFactory();
39 | // Use fresh caches
40 | OrmToolkitSettings.CommandsCache = new HashsetInstanceCache();
41 | OrmToolkitSettings.TypesCache = new HashsetInstanceCache();
42 | }
43 |
44 | public IPost GetItemAsObject(int Id)
45 | {
46 | object param = new { Id = Id };
47 | return conn.Query("select * from Posts where Id=@Id", param, option).First();
48 | }
49 |
50 | public dynamic GetItemAsDynamic(int Id)
51 | {
52 | return null;
53 | }
54 |
55 | public IList GetAllItemsAsObject()
56 | {
57 | return conn.Query("select * from Posts", null, option).ToList();
58 | }
59 |
60 | public IList GetAllItemsAsDynamic()
61 | {
62 | return null;
63 | }
64 | public void Finish()
65 | {
66 | conn.Close();
67 | }
68 |
69 | }
70 | }
71 | #endif
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/OrmToolkitExecuter.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Data.SqlClient;
5 | using System.Text;
6 | using ORMToolkit.Core;
7 | using ORMToolkit.Core.Factories;
8 | using ORMToolkit.Core.CacheProvider;
9 | using System.Linq;
10 |
11 | namespace OrmBenchmark.OrmToolkit
12 | {
13 | public class OrmToolkitExecuter : IOrmExecuter
14 | {
15 | SqlConnection conn;
16 | QueryOption option;
17 |
18 | public string Name
19 | {
20 | get
21 | {
22 | return "OrmToolkit";
23 | }
24 | }
25 |
26 | public void Init(string connectionStrong)
27 | {
28 | conn = new SqlConnection(connectionStrong);
29 | conn.Open();
30 |
31 | option = new QueryOption()
32 | {
33 |
34 | };
35 |
36 | OrmToolkitSettings.ObjectFactory = new ObjectFactory2();
37 | // Use fresh caches
38 | OrmToolkitSettings.CommandsCache = new HashsetInstanceCache();
39 | OrmToolkitSettings.TypesCache = new HashsetInstanceCache();
40 | }
41 |
42 | public IPost GetItemAsObject(int Id)
43 | {
44 | object param = new { Id = Id };
45 | return conn.Query("select * from Posts where Id=@Id", param, option).First();
46 | }
47 |
48 | public dynamic GetItemAsDynamic(int Id)
49 | {
50 | object param = new { Id = Id };
51 | return conn.Query("select * from Posts where Id=@Id", param).First();
52 | }
53 |
54 | public IList GetAllItemsAsObject()
55 | {
56 | return conn.Query("select * from Posts", null, option).ToList();
57 | }
58 |
59 | public IList GetAllItemsAsDynamic()
60 | {
61 | return conn.Query("select * from Posts", null).ToList();
62 | }
63 | public void Finish()
64 | {
65 | conn.Close();
66 | }
67 |
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/OrmToolkitNoQueryExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data.SqlClient;
4 | using System.Linq;
5 | using System.Text;
6 | using ORMToolkit.Core;
7 | using ORMToolkit.Core.Factories;
8 | using ORMToolkit.Core.CacheProvider;
9 | using OrmBenchmark.Core;
10 |
11 | namespace OrmBenchmark.OrmToolkit
12 | {
13 | public class OrmToolkitNoQueryExecuter : IOrmExecuter
14 | {
15 | SqlConnection conn;
16 | QueryOption option;
17 |
18 | public string Name
19 | {
20 | get
21 | {
22 | return "OrmToolkit (No Query)";
23 | }
24 | }
25 |
26 | public void Init(string connectionStrong)
27 | {
28 | conn = new SqlConnection(connectionStrong);
29 | conn.Open();
30 |
31 | option = new QueryOption()
32 | {
33 |
34 | };
35 |
36 | OrmToolkitSettings.ObjectFactory = new ObjectFactory2();
37 |
38 | OrmToolkitSettings.CommandsCache = new HashsetInstanceCache();
39 | OrmToolkitSettings.TypesCache = new HashsetInstanceCache();
40 | }
41 |
42 | public IPost GetItemAsObject(int Id)
43 | {
44 | object param = new { Id = Id };
45 | return conn.Get(param, option);
46 | }
47 |
48 | public dynamic GetItemAsDynamic(int Id)
49 | {
50 | object param = new { Id = Id };
51 | return conn.Get("Posts", param);
52 | }
53 |
54 | public IList GetAllItemsAsObject()
55 | {
56 | return conn.GetAll(null, null, option).ToList();
57 | }
58 |
59 | public IList GetAllItemsAsDynamic()
60 | {
61 | return conn.GetAll("Posts", null, null).ToList();
62 | }
63 | public void Finish()
64 | {
65 | conn.Close();
66 | }
67 |
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/OrmToolkitTestExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data.SqlClient;
4 | using System.Linq;
5 | using System.Text;
6 | using ORMToolkit.Core;
7 | using ORMToolkit.Core.Factories;
8 | using ORMToolkit.Core.CacheProvider;
9 | using OrmBenchmark.Core;
10 |
11 | namespace OrmBenchmark.OrmToolkit
12 | {
13 | public class OrmToolkitTestExecuter : IOrmExecuter
14 | {
15 | SqlConnection conn;
16 | QueryOption option;
17 |
18 | public string Name
19 | {
20 | get
21 | {
22 | return "OrmToolkit (Beta)";
23 | }
24 | }
25 |
26 | public void Init(string connectionStrong)
27 | {
28 | conn = new SqlConnection(connectionStrong);
29 | conn.Open();
30 |
31 | option = new QueryOption()
32 | {
33 |
34 | };
35 |
36 | OrmToolkitSettings.ObjectFactory = new ObjectFactory3();
37 | // Use fresh caches
38 | OrmToolkitSettings.CommandsCache = new HashsetInstanceCache();
39 | OrmToolkitSettings.TypesCache = new HashsetInstanceCache();
40 |
41 | }
42 |
43 | public IPost GetItemAsObject(int Id)
44 | {
45 | object param = new { Id = Id };
46 | return conn.Query("select * from Posts where Id=@Id", param, option).First();
47 | }
48 |
49 | public dynamic GetItemAsDynamic(int Id)
50 | {
51 | return null;
52 | }
53 |
54 | public IList GetAllItemsAsObject()
55 | {
56 | return conn.Query("select * from Posts", null, option).ToList();
57 | }
58 |
59 | public IList GetAllItemsAsDynamic()
60 | {
61 | return null;
62 | }
63 | public void Finish()
64 | {
65 | conn.Close();
66 | }
67 |
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/OrmBenchmark.OrmToolkit/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using ORMToolkit.Core.Attributes;
3 | using System;
4 |
5 | namespace OrmBenchmark.OrmToolkit
6 | {
7 | [TableInfo("Posts")]
8 | public class Post : IPost
9 | {
10 | public int Id { get; set; }
11 | public string Text { get; set; }
12 | public DateTime CreationDate { get; set; }
13 | public DateTime LastChangeDate { get; set; }
14 | public int? Counter1 { get; set; }
15 | public int? Counter2 { get; set; }
16 | public int? Counter3 { get; set; }
17 | public int? Counter4 { get; set; }
18 | public int? Counter5 { get; set; }
19 | public int? Counter6 { get; set; }
20 | public int? Counter7 { get; set; }
21 | public int? Counter8 { get; set; }
22 | public int? Counter9 { get; set; }
23 | //public int NotExistColumn { get; set; }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/OrmBenchmark.PetaPoco/OrmBenchmark.PetaPoco.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.PetaPoco
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | NETCORE;NETSTANDARD;NETSTANDARD2_0
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | NET46;NETFULL
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/OrmBenchmark.PetaPoco/PetaPocoExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using OrmBenchmark.Core;
6 | using PetaPoco;
7 |
8 | namespace OrmBenchmark.PetaPoco
9 | {
10 | public class PetaPocoExecuter : IOrmExecuter
11 | {
12 | Database petapoco;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "PetaPoco";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | petapoco = new Database(connectionStrong, "System.Data.SqlClient");
25 | petapoco.OpenSharedConnection();
26 | }
27 |
28 | public IPost GetItemAsObject(int Id)
29 | {
30 | object param = new { Id = Id };
31 | return petapoco.Query("select * from Posts where Id=@0", Id).First();
32 | }
33 |
34 | public dynamic GetItemAsDynamic(int Id)
35 | {
36 | object param = new { Id = Id };
37 | return petapoco.Fetch("select * from Posts where Id=@0", Id).First();
38 | }
39 |
40 | public IList GetAllItemsAsObject()
41 | {
42 | return petapoco.Query("select * from Posts").ToList();
43 | }
44 |
45 | public IList GetAllItemsAsDynamic()
46 | {
47 | return petapoco.Query("select * from Posts").ToList();
48 | }
49 |
50 | public void Finish()
51 | {
52 | //petapoco.Close();
53 | }
54 |
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/OrmBenchmark.PetaPoco/PetaPocoFastExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using OrmBenchmark.Core;
6 | using PetaPoco;
7 |
8 | namespace OrmBenchmark.PetaPoco
9 | {
10 | public class PetaPocoFastExecuter : IOrmExecuter
11 | {
12 | Database petapoco;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "PetaPoco (Fast)";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | petapoco = new Database(connectionStrong, "System.Data.SqlClient");
25 | petapoco.OpenSharedConnection();
26 | petapoco.EnableAutoSelect = false;
27 | petapoco.EnableNamedParams = false;
28 | //petapoco.ForceDateTimesToUtc = false;
29 | }
30 |
31 | public IPost GetItemAsObject(int Id)
32 | {
33 | object param = new { Id = Id };
34 | return petapoco.Query("select * from Posts where Id=@0", Id).First();
35 | }
36 |
37 | public dynamic GetItemAsDynamic(int Id)
38 | {
39 | object param = new { Id = Id };
40 | return petapoco.Fetch("select * from Posts where Id=@0", Id).First();
41 | }
42 |
43 | public IList GetAllItemsAsObject()
44 | {
45 | return petapoco.Query("select * from Posts").ToList();
46 | }
47 |
48 | public IList GetAllItemsAsDynamic()
49 | {
50 | return petapoco.Query("select * from Posts").ToList();
51 | }
52 |
53 | public void Finish()
54 | {
55 | //petapoco.Close();
56 | }
57 |
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/OrmBenchmark.PetaPoco/PetaPocoFetchExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using OrmBenchmark.Core;
6 | using PetaPoco;
7 |
8 | namespace OrmBenchmark.PetaPoco
9 | {
10 | public class PetaPocoFetchExecuter : IOrmExecuter
11 | {
12 | Database petapoco;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "PetaPoco (Fetch)";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | petapoco = new Database(connectionStrong, "System.Data.SqlClient");
25 | petapoco.OpenSharedConnection();
26 | }
27 |
28 | public IPost GetItemAsObject(int Id)
29 | {
30 | object param = new { Id = Id };
31 | return petapoco.Fetch("select * from Posts where Id=@0", Id).First();
32 | }
33 |
34 | public dynamic GetItemAsDynamic(int Id)
35 | {
36 | object param = new { Id = Id };
37 | return petapoco.Fetch("select * from Posts where Id=@0", Id).First();
38 | }
39 |
40 | public IList GetAllItemsAsObject()
41 | {
42 | return petapoco.Fetch("select * from Posts").ToList();
43 | }
44 |
45 | public IList GetAllItemsAsDynamic()
46 | {
47 | return petapoco.Fetch("select * from Posts");
48 | }
49 |
50 | public void Finish()
51 | {
52 | //petapoco.Close();
53 | }
54 |
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/OrmBenchmark.PetaPoco/PetaPocoFetchFastExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using OrmBenchmark.Core;
6 | using PetaPoco;
7 |
8 |
9 | namespace OrmBenchmark.PetaPoco
10 | {
11 | public class PetaPocoFetchFastExecuter : IOrmExecuter
12 | {
13 | Database petapoco;
14 |
15 | public string Name
16 | {
17 | get
18 | {
19 | return "PetaPoco (Fetch Fast)";
20 | }
21 | }
22 |
23 | public void Init(string connectionStrong)
24 | {
25 | petapoco = new Database(connectionStrong, "System.Data.SqlClient");
26 | petapoco.OpenSharedConnection();
27 | petapoco.EnableAutoSelect = false;
28 | petapoco.EnableNamedParams = false;
29 | //petapoco.ForceDateTimesToUtc = false;
30 | }
31 |
32 | public IPost GetItemAsObject(int Id)
33 | {
34 | object param = new { Id = Id };
35 | return petapoco.Fetch("select * from Posts where Id=@0", Id).First();
36 | }
37 |
38 | public dynamic GetItemAsDynamic(int Id)
39 | {
40 | object param = new { Id = Id };
41 | return petapoco.Fetch("select * from Posts where Id=@0", Id).First();
42 | }
43 |
44 | public IList GetAllItemsAsObject()
45 | {
46 | return petapoco.Fetch("select * from Posts").ToList();
47 | }
48 |
49 | public IList GetAllItemsAsDynamic()
50 | {
51 | return petapoco.Fetch("select * from Posts");
52 | }
53 |
54 | public void Finish()
55 | {
56 | //petapoco.Close();
57 | }
58 |
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/OrmBenchmark.PetaPoco/Post.cs:
--------------------------------------------------------------------------------
1 | using OrmBenchmark.Core;
2 | using System;
3 |
4 | namespace OrmBenchmark.PetaPoco
5 | {
6 | public class Post : IPost
7 | {
8 | public int Id { get; set; }
9 | public string Text { get; set; }
10 | public DateTime CreationDate { get; set; }
11 | public DateTime LastChangeDate { get; set; }
12 | public int? Counter1 { get; set; }
13 | public int? Counter2 { get; set; }
14 | public int? Counter3 { get; set; }
15 | public int? Counter4 { get; set; }
16 | public int? Counter5 { get; set; }
17 | public int? Counter6 { get; set; }
18 | public int? Counter7 { get; set; }
19 | public int? Counter8 { get; set; }
20 | public int? Counter9 { get; set; }
21 | //public int NotExistColumn { get; set; }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/OrmBenchmark.SimpleData/OrmBenchmark.SimpleData.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;net46
5 | OrmBenchmark.SimpleData
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | NETCORE;NETSTANDARD;NETSTANDARD2_0
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | NET46;NETFULL
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/OrmBenchmark.SimpleData/SimpleDataExecuter.NetFramework.cs:
--------------------------------------------------------------------------------
1 | #if NETFULL
2 | using OrmBenchmark.Core;
3 | using Simple.Data;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Text;
7 |
8 | namespace OrmBenchmark.SimpleData
9 | {
10 | public class SimpleDataExecuter : IOrmExecuter
11 | {
12 | dynamic sdb;
13 |
14 | public string Name
15 | {
16 | get
17 | {
18 | return "Simple.Data";
19 | }
20 | }
21 |
22 | public void Init(string connectionStrong)
23 | {
24 | sdb = Database.OpenConnection(connectionStrong);
25 | }
26 |
27 | public IPost GetItemAsObject(int Id)
28 | {
29 | return null;
30 | }
31 |
32 | public dynamic GetItemAsDynamic(int Id)
33 | {
34 | return sdb.Posts.FindById(Id);
35 | }
36 |
37 | public IList GetAllItemsAsObject()
38 | {
39 | return null;
40 | }
41 |
42 | public IList GetAllItemsAsDynamic()
43 | {
44 | return sdb.Posts.All().ToList();
45 | }
46 |
47 | public void Finish()
48 | {
49 |
50 | }
51 |
52 | }
53 | }
54 | #endif
--------------------------------------------------------------------------------
/OrmBenchmark.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.27004.2009
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrmBenchmark.Console", "OrmBenchmark.Console\OrmBenchmark.Console.csproj", "{2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}"
7 | EndProject
8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3B316F5D-5AB3-48AD-8CD1-7948C5C5C416}"
9 | ProjectSection(SolutionItems) = preProject
10 | README.md = README.md
11 | EndProjectSection
12 | EndProject
13 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.Console.NetCore", "OrmBenchmark.Console.NetCore\OrmBenchmark.Console.NetCore.csproj", "{F789C5DC-76CB-49E5-BB8E-28DD99C2050F}"
14 | EndProject
15 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.Core", "OrmBenchmark.Core\OrmBenchmark.Core.csproj", "{BF582E10-662A-48F8-A52A-07FD5E9E14D9}"
16 | EndProject
17 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.Ado", "OrmBenchmark.Ado\OrmBenchmark.Ado.csproj", "{92D3DDBF-22DF-4984-BF82-8F26BF837F58}"
18 | EndProject
19 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.Dapper", "OrmBenchmark.Dapper\OrmBenchmark.Dapper.csproj", "{6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}"
20 | EndProject
21 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.EntityFramework", "OrmBenchmark.EntityFramework\OrmBenchmark.EntityFramework.csproj", "{E08C4E3B-0689-4B6B-83A7-51FD7A722815}"
22 | EndProject
23 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.InsightDatabase", "OrmBenchmark.InsightDatabase\OrmBenchmark.InsightDatabase.csproj", "{8125A383-320A-4F37-8518-8B0712CA8D31}"
24 | EndProject
25 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.OrmLite", "OrmBenchmark.OrmLite\OrmBenchmark.OrmLite.csproj", "{C74719FE-6E81-4591-B2BC-CC1CFECC9722}"
26 | EndProject
27 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.OrmToolkit", "OrmBenchmark.OrmToolkit\OrmBenchmark.OrmToolkit.csproj", "{FA61681E-96FC-412F-A024-ECC7478AFDEB}"
28 | EndProject
29 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.PetaPoco", "OrmBenchmark.PetaPoco\OrmBenchmark.PetaPoco.csproj", "{288636F3-963C-4A6C-8ABF-99F99F4E1CA1}"
30 | EndProject
31 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.SimpleData", "OrmBenchmark.SimpleData\OrmBenchmark.SimpleData.csproj", "{E66CB3BA-31D3-4C1A-863F-697FCF24B401}"
32 | EndProject
33 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrmBenchmark.DevExpress", "OrmBenchmark.DevExpress\OrmBenchmark.DevExpress.csproj", "{57CF52C7-22EC-441E-992D-EEC311A8A157}"
34 | EndProject
35 | Global
36 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
37 | Debug|Any CPU = Debug|Any CPU
38 | Debug|x64 = Debug|x64
39 | Debug|x86 = Debug|x86
40 | Release|Any CPU = Release|Any CPU
41 | Release|x64 = Release|x64
42 | Release|x86 = Release|x86
43 | EndGlobalSection
44 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
45 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
46 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
47 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Debug|x64.ActiveCfg = Debug|Any CPU
48 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Debug|x64.Build.0 = Debug|Any CPU
49 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Debug|x86.ActiveCfg = Debug|Any CPU
50 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Debug|x86.Build.0 = Debug|Any CPU
51 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
52 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Release|Any CPU.Build.0 = Release|Any CPU
53 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Release|x64.ActiveCfg = Release|Any CPU
54 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Release|x64.Build.0 = Release|Any CPU
55 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Release|x86.ActiveCfg = Release|Any CPU
56 | {2B090F8B-4BFD-44B7-B8B7-D180EE919E8C}.Release|x86.Build.0 = Release|Any CPU
57 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
58 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Debug|Any CPU.Build.0 = Debug|Any CPU
59 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Debug|x64.ActiveCfg = Debug|Any CPU
60 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Debug|x64.Build.0 = Debug|Any CPU
61 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Debug|x86.ActiveCfg = Debug|Any CPU
62 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Debug|x86.Build.0 = Debug|Any CPU
63 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Release|Any CPU.ActiveCfg = Release|Any CPU
64 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Release|Any CPU.Build.0 = Release|Any CPU
65 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Release|x64.ActiveCfg = Release|Any CPU
66 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Release|x64.Build.0 = Release|Any CPU
67 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Release|x86.ActiveCfg = Release|Any CPU
68 | {F789C5DC-76CB-49E5-BB8E-28DD99C2050F}.Release|x86.Build.0 = Release|Any CPU
69 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
70 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
71 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Debug|x64.ActiveCfg = Debug|Any CPU
72 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Debug|x64.Build.0 = Debug|Any CPU
73 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Debug|x86.ActiveCfg = Debug|Any CPU
74 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Debug|x86.Build.0 = Debug|Any CPU
75 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
76 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Release|Any CPU.Build.0 = Release|Any CPU
77 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Release|x64.ActiveCfg = Release|Any CPU
78 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Release|x64.Build.0 = Release|Any CPU
79 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Release|x86.ActiveCfg = Release|Any CPU
80 | {BF582E10-662A-48F8-A52A-07FD5E9E14D9}.Release|x86.Build.0 = Release|Any CPU
81 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
82 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Debug|Any CPU.Build.0 = Debug|Any CPU
83 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Debug|x64.ActiveCfg = Debug|Any CPU
84 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Debug|x64.Build.0 = Debug|Any CPU
85 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Debug|x86.ActiveCfg = Debug|Any CPU
86 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Debug|x86.Build.0 = Debug|Any CPU
87 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Release|Any CPU.ActiveCfg = Release|Any CPU
88 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Release|Any CPU.Build.0 = Release|Any CPU
89 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Release|x64.ActiveCfg = Release|Any CPU
90 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Release|x64.Build.0 = Release|Any CPU
91 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Release|x86.ActiveCfg = Release|Any CPU
92 | {92D3DDBF-22DF-4984-BF82-8F26BF837F58}.Release|x86.Build.0 = Release|Any CPU
93 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
94 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Debug|Any CPU.Build.0 = Debug|Any CPU
95 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Debug|x64.ActiveCfg = Debug|Any CPU
96 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Debug|x64.Build.0 = Debug|Any CPU
97 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Debug|x86.ActiveCfg = Debug|Any CPU
98 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Debug|x86.Build.0 = Debug|Any CPU
99 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Release|Any CPU.ActiveCfg = Release|Any CPU
100 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Release|Any CPU.Build.0 = Release|Any CPU
101 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Release|x64.ActiveCfg = Release|Any CPU
102 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Release|x64.Build.0 = Release|Any CPU
103 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Release|x86.ActiveCfg = Release|Any CPU
104 | {6FEF3E25-BBA1-4915-AAFB-66FF9C00E478}.Release|x86.Build.0 = Release|Any CPU
105 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
106 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Debug|Any CPU.Build.0 = Debug|Any CPU
107 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Debug|x64.ActiveCfg = Debug|Any CPU
108 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Debug|x64.Build.0 = Debug|Any CPU
109 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Debug|x86.ActiveCfg = Debug|Any CPU
110 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Debug|x86.Build.0 = Debug|Any CPU
111 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Release|Any CPU.ActiveCfg = Release|Any CPU
112 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Release|Any CPU.Build.0 = Release|Any CPU
113 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Release|x64.ActiveCfg = Release|Any CPU
114 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Release|x64.Build.0 = Release|Any CPU
115 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Release|x86.ActiveCfg = Release|Any CPU
116 | {E08C4E3B-0689-4B6B-83A7-51FD7A722815}.Release|x86.Build.0 = Release|Any CPU
117 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
118 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Debug|Any CPU.Build.0 = Debug|Any CPU
119 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Debug|x64.ActiveCfg = Debug|Any CPU
120 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Debug|x64.Build.0 = Debug|Any CPU
121 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Debug|x86.ActiveCfg = Debug|Any CPU
122 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Debug|x86.Build.0 = Debug|Any CPU
123 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Release|Any CPU.ActiveCfg = Release|Any CPU
124 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Release|Any CPU.Build.0 = Release|Any CPU
125 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Release|x64.ActiveCfg = Release|Any CPU
126 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Release|x64.Build.0 = Release|Any CPU
127 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Release|x86.ActiveCfg = Release|Any CPU
128 | {8125A383-320A-4F37-8518-8B0712CA8D31}.Release|x86.Build.0 = Release|Any CPU
129 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
130 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Debug|Any CPU.Build.0 = Debug|Any CPU
131 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Debug|x64.ActiveCfg = Debug|Any CPU
132 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Debug|x64.Build.0 = Debug|Any CPU
133 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Debug|x86.ActiveCfg = Debug|Any CPU
134 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Debug|x86.Build.0 = Debug|Any CPU
135 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Release|Any CPU.ActiveCfg = Release|Any CPU
136 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Release|Any CPU.Build.0 = Release|Any CPU
137 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Release|x64.ActiveCfg = Release|Any CPU
138 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Release|x64.Build.0 = Release|Any CPU
139 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Release|x86.ActiveCfg = Release|Any CPU
140 | {C74719FE-6E81-4591-B2BC-CC1CFECC9722}.Release|x86.Build.0 = Release|Any CPU
141 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
142 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
143 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Debug|x64.ActiveCfg = Debug|Any CPU
144 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Debug|x64.Build.0 = Debug|Any CPU
145 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Debug|x86.ActiveCfg = Debug|Any CPU
146 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Debug|x86.Build.0 = Debug|Any CPU
147 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
148 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Release|Any CPU.Build.0 = Release|Any CPU
149 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Release|x64.ActiveCfg = Release|Any CPU
150 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Release|x64.Build.0 = Release|Any CPU
151 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Release|x86.ActiveCfg = Release|Any CPU
152 | {FA61681E-96FC-412F-A024-ECC7478AFDEB}.Release|x86.Build.0 = Release|Any CPU
153 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
154 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
155 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Debug|x64.ActiveCfg = Debug|Any CPU
156 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Debug|x64.Build.0 = Debug|Any CPU
157 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Debug|x86.ActiveCfg = Debug|Any CPU
158 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Debug|x86.Build.0 = Debug|Any CPU
159 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
160 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Release|Any CPU.Build.0 = Release|Any CPU
161 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Release|x64.ActiveCfg = Release|Any CPU
162 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Release|x64.Build.0 = Release|Any CPU
163 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Release|x86.ActiveCfg = Release|Any CPU
164 | {288636F3-963C-4A6C-8ABF-99F99F4E1CA1}.Release|x86.Build.0 = Release|Any CPU
165 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
166 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Debug|Any CPU.Build.0 = Debug|Any CPU
167 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Debug|x64.ActiveCfg = Debug|Any CPU
168 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Debug|x64.Build.0 = Debug|Any CPU
169 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Debug|x86.ActiveCfg = Debug|Any CPU
170 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Debug|x86.Build.0 = Debug|Any CPU
171 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Release|Any CPU.ActiveCfg = Release|Any CPU
172 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Release|Any CPU.Build.0 = Release|Any CPU
173 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Release|x64.ActiveCfg = Release|Any CPU
174 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Release|x64.Build.0 = Release|Any CPU
175 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Release|x86.ActiveCfg = Release|Any CPU
176 | {E66CB3BA-31D3-4C1A-863F-697FCF24B401}.Release|x86.Build.0 = Release|Any CPU
177 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
178 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Debug|Any CPU.Build.0 = Debug|Any CPU
179 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Debug|x64.ActiveCfg = Debug|Any CPU
180 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Debug|x64.Build.0 = Debug|Any CPU
181 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Debug|x86.ActiveCfg = Debug|Any CPU
182 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Debug|x86.Build.0 = Debug|Any CPU
183 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Release|Any CPU.ActiveCfg = Release|Any CPU
184 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Release|Any CPU.Build.0 = Release|Any CPU
185 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Release|x64.ActiveCfg = Release|Any CPU
186 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Release|x64.Build.0 = Release|Any CPU
187 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Release|x86.ActiveCfg = Release|Any CPU
188 | {57CF52C7-22EC-441E-992D-EEC311A8A157}.Release|x86.Build.0 = Release|Any CPU
189 | EndGlobalSection
190 | GlobalSection(SolutionProperties) = preSolution
191 | HideSolutionNode = FALSE
192 | EndGlobalSection
193 | GlobalSection(ExtensibilityGlobals) = postSolution
194 | SolutionGuid = {20894AAD-CC66-4D98-B8E9-3AB4D6BE3A5E}
195 | EndGlobalSection
196 | EndGlobal
197 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OrmBenchmark
2 | [](https://raw.githubusercontent.com/giacomelli/JobSharp/master/LICENSE)
3 |
4 | The goal of the ORM Benchmarking project is to determine how long it takes to execute select statement(s) against a MS SQL Server database and map the returned data to POCO/Dynamic objects in different ORMs.
5 | This program executes **.Net Framework** and **.Net Core** performance tests for supporting ORMs.
6 |
7 | Performance Tests
8 | -----------------
9 |
10 | The performance tests are broken in the following lists:
11 |
12 | - Performance test of executing one sql command frequently (500 times):
13 | - Performance of execute one select statement and map a returned row to a POCO object over 500 iterations
14 | - Performance of execute one select statement and map a returned row to a dynamic object over 500 iterations
15 |
16 | - Performance test of mapping database records to POCO/Dynamic objects (5000 row):
17 | - Performance of mapping 5000 rows returned by one select to POCO objects in one iteration
18 | - Performance of mapping 5000 rows returned by one select to Dynamic objects in one iteration
19 |
20 |
21 | Testing ORMs
22 | ------------
23 | Here is list of ORMs and data access technologis that this program tests.
24 |
25 | - Pure Ado
26 | - Dapper
27 | - PetaPoco
28 | - ServiceStack.OrmLite
29 | - EntityFramework
30 | - InsightDatabase
31 | - SimpleData
32 | - OrmToolkit
33 | - DevExpress Xpo (Not working with Local DB mode
34 | )
35 |
36 | How to run the benchmarks
37 | -------------------------
38 |
39 | Just download the project and run it or add your favorite ORM as a plugin to the project.
40 |
41 | - For testing .Net Framework ORMs run **OrmBenchmark.Console** project.
42 | - For testing .Net Core ORMs run **OrmBenchmark.Console.NetCore** project.
--------------------------------------------------------------------------------