├── .gitignore
├── Codable
├── Package.swift
└── Sources
│ └── Benchmark
│ ├── TaskDto.swift
│ ├── TaskJson.swift
│ └── main.swift
├── HandyJSON
├── Package.swift
└── Sources
│ └── Benchmark
│ ├── TaskDto.swift
│ ├── TaskJson.swift
│ └── main.swift
├── Marshall
├── Package.swift
└── Sources
│ └── Benchmark
│ ├── Extensions.swift
│ ├── TaskDto.swift
│ ├── TaskJson.swift
│ └── main.swift
├── NetCore
├── NetCore.csproj
├── Program.cs
└── TaskDto.cs
├── ObjectMapper
├── Package.swift
└── Sources
│ └── Benchmark
│ ├── TaskDto.swift
│ ├── TaskJson.swift
│ └── main.swift
├── PMJSON
├── Package.swift
└── Sources
│ └── Benchmark
│ ├── TaskDto.swift
│ ├── TaskJson.swift
│ └── main.swift
├── Performance
├── Statystyki-wydajnosc.md
├── benchmark-001.png
├── benchmark-002.png
├── benchmark-003.png
├── benchmark-004.png
├── benchmark-005.png
├── benchmark-006.png
├── benchmark-007.png
├── infrastructure.png
└── infrastructure.pxm
├── README.md
├── SwiftProtobuf
├── Package.swift
└── Sources
│ └── Benchmark
│ ├── DataModel.pb.swift
│ ├── DataModel.proto
│ └── main.swift
├── build.sh
├── list-chart.json
├── object-chart.json
└── run.sh
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/git,xcode,macos,linux,swift,swiftpm,windows,visualstudiocode
3 |
4 | ### Git ###
5 | *.orig
6 |
7 | ### Linux ###
8 | *~
9 |
10 | # temporary files which can be created if a process still has a handle open of a deleted file
11 | .fuse_hidden*
12 |
13 | # KDE directory preferences
14 | .directory
15 |
16 | # Linux trash folder which might appear on any partition or disk
17 | .Trash-*
18 |
19 | # .nfs files are created when an open file is removed but is still being accessed
20 | .nfs*
21 |
22 | ### macOS ###
23 | *.DS_Store
24 | .AppleDouble
25 | .LSOverride
26 |
27 | # Icon must end with two \r
28 | Icon
29 |
30 | # Thumbnails
31 | ._*
32 |
33 | # Files that might appear in the root of a volume
34 | .DocumentRevisions-V100
35 | .fseventsd
36 | .Spotlight-V100
37 | .TemporaryItems
38 | .Trashes
39 | .VolumeIcon.icns
40 | .com.apple.timemachine.donotpresent
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
49 | ### Swift ###
50 | # Xcode
51 | #
52 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
53 |
54 | ## Build generated
55 | build/
56 | DerivedData/
57 |
58 | ## Various settings
59 | *.pbxuser
60 | !default.pbxuser
61 | *.mode1v3
62 | !default.mode1v3
63 | *.mode2v3
64 | !default.mode2v3
65 | *.perspectivev3
66 | !default.perspectivev3
67 | xcuserdata/
68 |
69 | ## Other
70 | *.moved-aside
71 | *.xccheckout
72 | *.xcscmblueprint
73 |
74 | ## Obj-C/Swift specific
75 | *.hmap
76 | *.ipa
77 | *.dSYM.zip
78 | *.dSYM
79 |
80 | ## Playgrounds
81 | timeline.xctimeline
82 | playground.xcworkspace
83 |
84 | # Swift Package Manager
85 | #
86 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
87 | # Packages/
88 | # Package.pins
89 | .build/
90 |
91 | # CocoaPods - Refactored to standalone file
92 |
93 | # Carthage - Refactored to standalone file
94 |
95 | # fastlane
96 | #
97 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
98 | # screenshots whenever they are needed.
99 | # For more information about the recommended setup visit:
100 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
101 |
102 | fastlane/report.xml
103 | fastlane/Preview.html
104 | fastlane/screenshots
105 | fastlane/test_output
106 |
107 | ### SwiftPM ###
108 | Packages
109 | xcuserdata
110 | *.xcodeproj
111 | ### VisualStudioCode ###
112 | .vscode/*
113 | !.vscode/settings.json
114 | !.vscode/tasks.json
115 | !.vscode/launch.json
116 | !.vscode/extensions.json
117 | .history
118 | Package.resolved
119 |
120 | ### Windows ###
121 | # Windows thumbnail cache files
122 | Thumbs.db
123 | ehthumbs.db
124 | ehthumbs_vista.db
125 |
126 | # Folder config file
127 | Desktop.ini
128 |
129 | # Recycle Bin used on file shares
130 | $RECYCLE.BIN/
131 |
132 | # Windows Installer files
133 | *.cab
134 | *.msi
135 | *.msm
136 | *.msp
137 |
138 | # Windows shortcuts
139 | *.lnk
140 |
141 | ### Xcode ###
142 | # Xcode
143 | #
144 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
145 |
146 | ## Build generated
147 |
148 | ## Various settings
149 |
150 | ## Other
151 |
152 | ### Xcode Patch ###
153 | *.xcodeproj/*
154 | !*.xcodeproj/project.pbxproj
155 | !*.xcodeproj/xcshareddata/
156 | !*.xcworkspace/contents.xcworkspacedata
157 | /*.gcno
158 |
159 |
160 | # End of https://www.gitignore.io/api/git,xcode,macos,linux,swift,swiftpm,windows,visualstudiocode
161 |
162 |
163 | # Created by https://www.gitignore.io/api/aspnetcore
164 |
165 | ### ASPNETCore ###
166 | ## Ignore Visual Studio temporary files, build results, and
167 | ## files generated by popular Visual Studio add-ons.
168 |
169 | # User-specific files
170 | *.suo
171 | *.user
172 | *.userosscache
173 | *.sln.docstates
174 |
175 | # User-specific files (MonoDevelop/Xamarin Studio)
176 | *.userprefs
177 |
178 | # Build results
179 | [Dd]ebug/
180 | [Dd]ebugPublic/
181 | [Rr]elease/
182 | [Rr]eleases/
183 | x64/
184 | x86/
185 | bld/
186 | [Bb]in/
187 | [Oo]bj/
188 | [Ll]og/
189 |
190 | # Visual Studio 2015 cache/options directory
191 | .vs/
192 | # Uncomment if you have tasks that create the project's static files in wwwroot
193 | #wwwroot/
194 |
195 | # MSTest test Results
196 | [Tt]est[Rr]esult*/
197 | [Bb]uild[Ll]og.*
198 |
199 | # NUNIT
200 | *.VisualState.xml
201 | TestResult.xml
202 |
203 | # Build Results of an ATL Project
204 | [Dd]ebugPS/
205 | [Rr]eleasePS/
206 | dlldata.c
207 |
208 | # DNX
209 | project.lock.json
210 | project.fragment.lock.json
211 | artifacts/
212 |
213 | *_i.c
214 | *_p.c
215 | *_i.h
216 | *.ilk
217 | *.meta
218 | *.obj
219 | *.pch
220 | *.pdb
221 | *.pgc
222 | *.pgd
223 | *.rsp
224 | *.sbr
225 | *.tlb
226 | *.tli
227 | *.tlh
228 | *.tmp
229 | *.tmp_proj
230 | *.log
231 | *.vspscc
232 | *.vssscc
233 | .builds
234 | *.pidb
235 | *.svclog
236 | *.scc
237 |
238 | # Chutzpah Test files
239 | _Chutzpah*
240 |
241 | # Visual C++ cache files
242 | ipch/
243 | *.aps
244 | *.ncb
245 | *.opendb
246 | *.opensdf
247 | *.sdf
248 | *.cachefile
249 | *.VC.db
250 | *.VC.VC.opendb
251 |
252 | # Visual Studio profiler
253 | *.psess
254 | *.vsp
255 | *.vspx
256 | *.sap
257 |
258 | # TFS 2012 Local Workspace
259 | $tf/
260 |
261 | # Guidance Automation Toolkit
262 | *.gpState
263 |
264 | # ReSharper is a .NET coding add-in
265 | _ReSharper*/
266 | *.[Rr]e[Ss]harper
267 | *.DotSettings.user
268 |
269 | # JustCode is a .NET coding add-in
270 | .JustCode
271 |
272 | # TeamCity is a build add-in
273 | _TeamCity*
274 |
275 | # DotCover is a Code Coverage Tool
276 | *.dotCover
277 |
278 | # Visual Studio code coverage results
279 | *.coverage
280 | *.coveragexml
281 |
282 | # NCrunch
283 | _NCrunch_*
284 | .*crunch*.local.xml
285 | nCrunchTemp_*
286 |
287 | # MightyMoose
288 | *.mm.*
289 | AutoTest.Net/
290 |
291 | # Web workbench (sass)
292 | .sass-cache/
293 |
294 | # Installshield output folder
295 | [Ee]xpress/
296 |
297 | # DocProject is a documentation generator add-in
298 | DocProject/buildhelp/
299 | DocProject/Help/*.HxT
300 | DocProject/Help/*.HxC
301 | DocProject/Help/*.hhc
302 | DocProject/Help/*.hhk
303 | DocProject/Help/*.hhp
304 | DocProject/Help/Html2
305 | DocProject/Help/html
306 |
307 | # Click-Once directory
308 | publish/
309 |
310 | # Publish Web Output
311 | *.[Pp]ublish.xml
312 | *.azurePubxml
313 | # TODO: Comment the next line if you want to checkin your web deploy settings
314 | # but database connection strings (with potential passwords) will be unencrypted
315 | *.pubxml
316 | *.publishproj
317 |
318 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
319 | # checkin your Azure Web App publish settings, but sensitive information contained
320 | # in these scripts will be unencrypted
321 | PublishScripts/
322 |
323 | # NuGet Packages
324 | *.nupkg
325 | # The packages folder can be ignored because of Package Restore
326 | **/packages/*
327 | # except build/, which is used as an MSBuild target.
328 | !**/packages/build/
329 | # Uncomment if necessary however generally it will be regenerated when needed
330 | #!**/packages/repositories.config
331 | # NuGet v3's project.json files produces more ignoreable files
332 | *.nuget.props
333 | *.nuget.targets
334 |
335 | # Microsoft Azure Build Output
336 | csx/
337 | *.build.csdef
338 |
339 | # Microsoft Azure Emulator
340 | ecf/
341 | rcf/
342 |
343 | # Windows Store app package directories and files
344 | AppPackages/
345 | BundleArtifacts/
346 | Package.StoreAssociation.xml
347 | _pkginfo.txt
348 |
349 | # Visual Studio cache files
350 | # files ending in .cache can be ignored
351 | *.[Cc]ache
352 | # but keep track of directories ending in .cache
353 | !*.[Cc]ache/
354 |
355 | # Others
356 | ClientBin/
357 | ~$*
358 | *~
359 | *.dbmdl
360 | *.dbproj.schemaview
361 | *.jfm
362 | *.pfx
363 | *.publishsettings
364 | node_modules/
365 | orleans.codegen.cs
366 |
367 | # Since there are multiple workflows, uncomment next line to ignore bower_components
368 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
369 | #bower_components/
370 |
371 | # RIA/Silverlight projects
372 | Generated_Code/
373 |
374 | # Backup & report files from converting an old project file
375 | # to a newer Visual Studio version. Backup files are not needed,
376 | # because we have git ;-)
377 | _UpgradeReport_Files/
378 | Backup*/
379 | UpgradeLog*.XML
380 | UpgradeLog*.htm
381 |
382 | # SQL Server files
383 | *.mdf
384 | *.ldf
385 |
386 | # Business Intelligence projects
387 | *.rdl.data
388 | *.bim.layout
389 | *.bim_*.settings
390 |
391 | # Microsoft Fakes
392 | FakesAssemblies/
393 |
394 | # GhostDoc plugin setting file
395 | *.GhostDoc.xml
396 |
397 | # Node.js Tools for Visual Studio
398 | .ntvs_analysis.dat
399 |
400 | # Visual Studio 6 build log
401 | *.plg
402 |
403 | # Visual Studio 6 workspace options file
404 | *.opt
405 |
406 | # Visual Studio LightSwitch build output
407 | **/*.HTMLClient/GeneratedArtifacts
408 | **/*.DesktopClient/GeneratedArtifacts
409 | **/*.DesktopClient/ModelManifest.xml
410 | **/*.Server/GeneratedArtifacts
411 | **/*.Server/ModelManifest.xml
412 | _Pvt_Extensions
413 |
414 | # Paket dependency manager
415 | .paket/paket.exe
416 | paket-files/
417 |
418 | # FAKE - F# Make
419 | .fake/
420 |
421 | # JetBrains Rider
422 | .idea/
423 | *.sln.iml
424 |
425 | # CodeRush
426 | .cr/
427 |
428 | # Python Tools for Visual Studio (PTVS)
429 | __pycache__/
430 | *.pyc
431 |
432 | # Cake - Uncomment if you are using it
433 | # tools/
434 |
435 |
436 | # End of https://www.gitignore.io/api/aspnetcore
--------------------------------------------------------------------------------
/Codable/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:4.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Benchmark",
8 | dependencies: [
9 | ],
10 | targets: [
11 | .target(name: "Benchmark", dependencies: []),
12 | ]
13 | )
14 |
--------------------------------------------------------------------------------
/Codable/Sources/Benchmark/TaskDto.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | class TaskClassDto: Codable {
4 |
5 | public var id: String?
6 | public var createDate: Date?
7 | public var name: String
8 | public var isFinished: Bool
9 | public var subtasks: Int
10 | public var weight: Double
11 | public var children: [String]?
12 | public var description: String?
13 | public var deadline: Date?
14 | public var tags: [String]?
15 |
16 | init(
17 | id: String,
18 | createDate: Date,
19 | name: String,
20 | isFinished: Bool,
21 | subtasks: Int,
22 | weight: Double,
23 | children: [String],
24 | description: String?,
25 | deadline: Date?,
26 | tags: [String]?
27 | ) {
28 | self.id = id
29 | self.createDate = createDate
30 | self.name = name
31 | self.isFinished = isFinished
32 | self.subtasks = subtasks
33 | self.weight = weight
34 | self.children = children
35 | self.description = description
36 | self.deadline = deadline
37 | self.tags = tags
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Codable/Sources/Benchmark/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | func evaluateProblem(_ name: String, method: () -> Void) {
4 |
5 | let start = DispatchTime.now()
6 | method()
7 | let end = DispatchTime.now()
8 |
9 | let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
10 | let timeInterval = Double(nanoTime) / 1_000_000_000
11 |
12 | print(" \(name): \(timeInterval) seconds")
13 | }
14 |
15 | func getList() -> [TaskClassDto] {
16 | let currentDate = Date()
17 | var list: [TaskClassDto] = []
18 | for i in 1...100 {
19 | list.append(
20 | TaskClassDto(
21 | id: UUID().uuidString,
22 | createDate: currentDate,
23 | name: "Task \(i)",
24 | isFinished: false,
25 | subtasks: 212,
26 | weight: 3.14,
27 | children: ["taska", "taskb", "taskc"],
28 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
29 | deadline: currentDate,
30 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
31 | )
32 | )
33 | }
34 |
35 | return list
36 | }
37 |
38 | func getObject() -> TaskClassDto {
39 | return TaskClassDto(
40 | id: UUID().uuidString,
41 | createDate: Date(),
42 | name: "Task 1",
43 | isFinished: false,
44 | subtasks: 212,
45 | weight: 3.14,
46 | children: ["taska", "taskb", "taskc"],
47 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
48 | deadline: Date(),
49 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
50 | )
51 | }
52 |
53 | var entityJson = TaskJson.getTaskJson()
54 | var listJson = TaskJson.getTasksJson()
55 |
56 | var entity = getObject()
57 | var list = getList()
58 |
59 | print("Running benchmarks for Codable:")
60 |
61 | // Encoding single object 10,000 times.
62 | evaluateProblem("#1 Encoding (single object)") {
63 | let encoder = JSONEncoder()
64 | let formatter = DateFormatter()
65 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
66 | encoder.dateEncodingStrategy = .formatted(formatter)
67 |
68 | do {
69 | for _ in 1...10_000 {
70 | let jsonData = try encoder.encode(entity)
71 | _ = String(data: jsonData, encoding: .utf8)
72 | }
73 | } catch {
74 | print("Error during serialization object to JSON: \(error)")
75 | }
76 | }
77 |
78 | // Encoding list of objects 10,000 times.
79 | evaluateProblem("#2 Encoding (list of objects)") {
80 | let encoder = JSONEncoder()
81 | let formatter = DateFormatter()
82 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
83 | encoder.dateEncodingStrategy = .formatted(formatter)
84 |
85 | do {
86 | for _ in 1...10_000 {
87 | let jsonData = try encoder.encode(list)
88 | _ = String(data: jsonData, encoding: .utf8)
89 | }
90 | } catch {
91 | print("Error during serialization object to JSON: \(error)")
92 | }
93 | }
94 |
95 | // Decoding single object 10,000 times.
96 | evaluateProblem("#3 Decoding (single object)") {
97 | let decoder = JSONDecoder()
98 | let formatter = DateFormatter()
99 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
100 | decoder.dateDecodingStrategy = .formatted(formatter)
101 |
102 | do {
103 | for _ in 1...10_000 {
104 | let entityJsonData = entityJson.data(using: .utf8)!
105 | _ = try decoder.decode(TaskClassDto.self, from: entityJsonData)
106 | }
107 | } catch {
108 | print("Error during deserialization object from JSON: \(error)")
109 | }
110 | }
111 |
112 | // Decoding list of objects 10,000 times.
113 | evaluateProblem("#4 Decoding (list of objects)") {
114 | let decoder = JSONDecoder()
115 | let formatter = DateFormatter()
116 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
117 | decoder.dateDecodingStrategy = .formatted(formatter)
118 |
119 | do {
120 | for _ in 1...10_000 {
121 | let entityJsonData = listJson.data(using: .utf8)!
122 | _ = try decoder.decode([TaskClassDto].self, from: entityJsonData)
123 | }
124 | } catch {
125 | print("Error during deserialization object from JSON: \(error)")
126 | }
127 | }
128 |
129 |
--------------------------------------------------------------------------------
/HandyJSON/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:4.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Benchmark",
8 | dependencies: [
9 | .package(url: "https://github.com/alibaba/HandyJSON.git", from: "4.1.3")
10 | ],
11 | targets: [
12 | .target(name: "Benchmark", dependencies: ["HandyJSON"]),
13 | ]
14 | )
15 |
--------------------------------------------------------------------------------
/HandyJSON/Sources/Benchmark/TaskDto.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import HandyJSON
3 |
4 | class TaskClassDto: HandyJSON {
5 |
6 | public var id: String?
7 | public var createDate: Date?
8 | public var name: String
9 | public var isFinished: Bool
10 | public var subtasks: Int
11 | public var weight: Double
12 | public var children: [String]?
13 | public var description: String?
14 | public var deadline: Date?
15 | public var tags: [String]?
16 |
17 | required init() {
18 | self.id = nil
19 | self.createDate = nil
20 | self.name = ""
21 | self.isFinished = false
22 | self.subtasks = 0
23 | self.weight = 1.0
24 | self.children = nil
25 | self.description = ""
26 | self.deadline = nil
27 | self.tags = nil
28 | }
29 |
30 | func mapping(mapper: HelpingMapper) {
31 | mapper <<< createDate <-- CustomDateFormatTransform(formatString: "yyyy-MM-dd'T'HH:mm:ssZ")
32 | mapper <<< deadline <-- CustomDateFormatTransform(formatString: "yyyy-MM-dd'T'HH:mm:ssZ")
33 | }
34 |
35 | init(
36 | id: String,
37 | createDate: Date,
38 | name: String,
39 | isFinished: Bool,
40 | subtasks: Int,
41 | weight: Double,
42 | children: [String],
43 | description: String?,
44 | deadline: Date?,
45 | tags: [String]?
46 | ) {
47 | self.id = id
48 | self.createDate = createDate
49 | self.name = name
50 | self.isFinished = isFinished
51 | self.subtasks = subtasks
52 | self.weight = weight
53 | self.children = children
54 | self.description = description
55 | self.deadline = deadline
56 | self.tags = tags
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/HandyJSON/Sources/Benchmark/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import HandyJSON
3 |
4 | func evaluateProblem(_ name: String, method: () -> Void) {
5 |
6 | let start = DispatchTime.now()
7 | method()
8 | let end = DispatchTime.now()
9 |
10 | let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
11 | let timeInterval = Double(nanoTime) / 1_000_000_000
12 |
13 | print(" \(name): \(timeInterval) seconds")
14 | }
15 |
16 | func getList() -> [TaskClassDto] {
17 | let currentDate = Date()
18 | var list: [TaskClassDto] = []
19 | for i in 1...100 {
20 | list.append(
21 | TaskClassDto(
22 | id: UUID().uuidString,
23 | createDate: currentDate,
24 | name: "Task \(i)",
25 | isFinished: false,
26 | subtasks: 212,
27 | weight: 3.14,
28 | children: ["taska", "taskb", "taskc"],
29 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
30 | deadline: currentDate,
31 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
32 | )
33 | )
34 | }
35 |
36 | return list
37 | }
38 |
39 | func getObject() -> TaskClassDto {
40 | return TaskClassDto(
41 | id: UUID().uuidString,
42 | createDate: Date(),
43 | name: "Task 1",
44 | isFinished: false,
45 | subtasks: 212,
46 | weight: 3.14,
47 | children: ["taska", "taskb", "taskc"],
48 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
49 | deadline: Date(),
50 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
51 | )
52 | }
53 |
54 | var entityJson = TaskJson.getTaskJson()
55 | var listJson = TaskJson.getTasksJson()
56 |
57 | var entity = getObject()
58 | var list = getList()
59 |
60 | print("Running benchmarks for HandyJSON:")
61 |
62 | // Encoding single object 10,000 times.
63 | evaluateProblem("#1 Encoding (single object)") {
64 | for _ in 1...10_000 {
65 | _ = entity.toJSONString()
66 | }
67 | }
68 |
69 | // Encoding list of objects 10,000 times.
70 | evaluateProblem("#2 Encoding (list of objects)") {
71 | for _ in 1...10_000 {
72 | _ = list.toJSONString()
73 | }
74 | }
75 |
76 | // Decoding single object 10,000 times.
77 | evaluateProblem("#3 Decoding (single object)") {
78 | for _ in 1...10_000 {
79 | _ = TaskClassDto.deserialize(from: entityJson)
80 | }
81 | }
82 |
83 | // Decoding list of objects 10,000 times.
84 | evaluateProblem("#4 Decoding (list of objects)") {
85 | for _ in 1...10_000 {
86 | _ = [TaskClassDto].deserialize(from: listJson)
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/Marshall/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:4.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Benchmark",
8 | dependencies: [
9 | .package(url: "https://github.com/utahiosmac/Marshal.git", from: "1.2.4")
10 | ],
11 | targets: [
12 | .target(name: "Benchmark", dependencies: ["Marshal"]),
13 | ]
14 | )
15 |
--------------------------------------------------------------------------------
/Marshall/Sources/Benchmark/Extensions.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Marshal
3 |
4 | extension Date : ValueType {
5 | public static func value(from object: Any) throws -> Date {
6 | guard let dateString = object as? String else {
7 | throw MarshalError.typeMismatch(expected: String.self, actual: type(of: object))
8 | }
9 |
10 | guard let date = DateHelper.fromISO8601String(dateString) else {
11 | throw MarshalError.typeMismatch(expected: "ISO8601 date string", actual: dateString)
12 | }
13 |
14 | return date
15 | }
16 | }
17 |
18 | class DateHelper {
19 | private static let formatter = DateFormatter()
20 |
21 | public static func fromISO8601String(_ dateString: String) -> Date? {
22 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
23 | return formatter.date(from: dateString)
24 | }
25 |
26 | public static func toISO8601String(_ date: Date?) -> String? {
27 |
28 | guard let dateValue = date else {
29 | return nil
30 | }
31 |
32 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
33 | return formatter.string(from: dateValue)
34 | }
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/Marshall/Sources/Benchmark/TaskDto.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Marshal
3 |
4 | class TaskClassDto: Marshaling, Unmarshaling {
5 |
6 | public var id: String?
7 | public var createDate: Date?
8 | public var name: String
9 | public var isFinished: Bool
10 | public var subtasks: Int
11 | public var weight: Double
12 | public var children: [String]?
13 | public var description: String?
14 | public var deadline: Date?
15 | public var tags: [String]?
16 |
17 | required init() {
18 | self.id = nil
19 | self.createDate = nil
20 | self.name = ""
21 | self.isFinished = false
22 | self.subtasks = 0
23 | self.weight = 1.0
24 | self.children = nil
25 | self.description = ""
26 | self.deadline = nil
27 | self.tags = nil
28 | }
29 |
30 | init(
31 | id: String,
32 | createDate: Date,
33 | name: String,
34 | isFinished: Bool,
35 | subtasks: Int,
36 | weight: Double,
37 | children: [String],
38 | description: String?,
39 | deadline: Date?,
40 | tags: [String]?
41 | ) {
42 | self.id = id
43 | self.createDate = createDate
44 | self.name = name
45 | self.isFinished = isFinished
46 | self.subtasks = subtasks
47 | self.weight = weight
48 | self.children = children
49 | self.description = description
50 | self.deadline = deadline
51 | self.tags = tags
52 | }
53 |
54 | required init(object: MarshaledObject) throws {
55 | id = try object.value(for: "id")
56 | createDate = try object.value(for: "createDate")
57 | name = try object.value(for: "name")
58 | isFinished = try object.value(for: "isFinished")
59 | subtasks = try object.value(for: "subtasks")
60 | weight = try object.value(for: "weight")
61 | children = try object.value(for: "children")
62 | description = try object.value(for: "description")
63 | deadline = try object.value(for: "deadline")
64 | tags = try object.value(for: "tags")
65 | }
66 |
67 | func marshaled() -> [String: Any?] {
68 | return [
69 | "id": id ?? "",
70 | "createDate" : DateHelper.toISO8601String(createDate),
71 | "name": name,
72 | "isFinished": isFinished,
73 | "subtasks": subtasks,
74 | "weight": weight,
75 | "children": children,
76 | "description": description,
77 | "deadline": DateHelper.toISO8601String(deadline),
78 | "tags": tags
79 | ]
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/Marshall/Sources/Benchmark/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Marshal
3 |
4 | func evaluateProblem(_ name: String, method: () -> Void) {
5 |
6 | let start = DispatchTime.now()
7 | method()
8 | let end = DispatchTime.now()
9 |
10 | let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
11 | let timeInterval = Double(nanoTime) / 1_000_000_000
12 |
13 | print(" \(name): \(timeInterval) seconds")
14 | }
15 |
16 | func getList() -> [TaskClassDto] {
17 | let currentDate = Date()
18 | var list: [TaskClassDto] = []
19 | for i in 1...100 {
20 | list.append(
21 | TaskClassDto(
22 | id: UUID().uuidString,
23 | createDate: currentDate,
24 | name: "Task \(i)",
25 | isFinished: false,
26 | subtasks: 212,
27 | weight: 3.14,
28 | children: ["taska", "taskb", "taskc"],
29 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
30 | deadline: currentDate,
31 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
32 | )
33 | )
34 | }
35 |
36 | return list
37 | }
38 |
39 | func getObject() -> TaskClassDto {
40 | return TaskClassDto(
41 | id: UUID().uuidString,
42 | createDate: Date(),
43 | name: "Task 1",
44 | isFinished: false,
45 | subtasks: 212,
46 | weight: 3.14,
47 | children: ["taska", "taskb", "taskc"],
48 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
49 | deadline: Date(),
50 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
51 | )
52 | }
53 |
54 | func listToMarshaled(list: [TaskClassDto]) -> [Any] {
55 | var dict: [Any] = []
56 |
57 | for item in list {
58 | dict.append(item.marshaled())
59 | }
60 |
61 | return dict;
62 | }
63 |
64 | var entityJson = TaskJson.getTaskJson()
65 | var listJson = TaskJson.getTasksJson()
66 |
67 | var entity = getObject()
68 | var list = getList()
69 |
70 | print("Running benchmarks for Marshall:")
71 |
72 | // Encoding single object 10,000 times.
73 | evaluateProblem("#1 Encoding (single object)") {
74 | do {
75 | for _ in 1...10_000 {
76 | let entityMarshaled = entity.marshaled()
77 | let jsonData = try JSONSerialization.data(withJSONObject: entityMarshaled)
78 | _ = String(data: jsonData, encoding: .utf8)
79 | }
80 | } catch {
81 | print("Error during serialization object to JSON: \(error)")
82 | }
83 | }
84 |
85 | // Encoding list of objects 10,000 times.
86 | evaluateProblem("#2 Encoding (list of objects)") {
87 | do {
88 | for _ in 1...10_000 {
89 | let listMarshaled = listToMarshaled(list: list)
90 | let jsonData = try JSONSerialization.data(withJSONObject: listMarshaled)
91 | _ = String(data: jsonData, encoding: .utf8)
92 | }
93 | } catch {
94 | print("Error during serialization object to JSON: \(error)")
95 | }
96 | }
97 |
98 | // Decoding single object 10,000 times.
99 | evaluateProblem("#3 Decoding (single object)") {
100 | do {
101 | for _ in 1...10_000 {
102 | let entityJsonData = entityJson.data(using: .utf8)!
103 | let json = try JSONSerialization.jsonObject(with: entityJsonData, options: []) as! MarshaledObject
104 | _ = try TaskClassDto(object: json)
105 | }
106 | } catch {
107 | print("Error during deserialization object from JSON: \(error)")
108 | }
109 | }
110 |
111 | // Decoding list of objects 10,000 times.
112 | evaluateProblem("#4 Decoding (list of objects)") {
113 | do {
114 | for _ in 1...10_000 {
115 | let entityJsonData = listJson.data(using: .utf8)!
116 | let json = try JSONSerialization.jsonObject(with: entityJsonData, options: []) as! [MarshaledObject]
117 |
118 | var objectArray: [TaskClassDto] = []
119 | for item in json {
120 | let taskDto = try TaskClassDto(object: item)
121 | objectArray.append(taskDto)
122 | }
123 | }
124 | } catch {
125 | print("Error during deserialization object from JSON: \(error)")
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/NetCore/NetCore.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp2.0
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/NetCore/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Newtonsoft.Json;
4 |
5 | namespace NetCore
6 | {
7 | class Program
8 | {
9 | private static List GetTasks()
10 | {
11 | var list = new List();
12 | for (int i = 1; i <= 100; ++i)
13 | {
14 | list.Add(new TaskDto
15 | {
16 | Id = Guid.NewGuid().ToString(),
17 | CreateDate = DateTime.Now,
18 | Name = $"Task {i}",
19 | IsFinished = false,
20 | Subtasks = 212,
21 | Weight = 3.14,
22 | Children = new string[] { "taska", "taskb", "taskc" },
23 | Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
24 | Deadline = DateTime.Now,
25 | Tags = new string[] { "tag1", "tag2", "tag3", "tag4", "tag5" }
26 | });
27 | }
28 |
29 | return list;
30 | }
31 |
32 | private static TaskDto GetObject()
33 | {
34 | return new TaskDto
35 | {
36 | Id = Guid.NewGuid().ToString(),
37 | CreateDate = DateTime.Now,
38 | Name = $"Task 1",
39 | IsFinished = false,
40 | Subtasks = 212,
41 | Weight = 3.14,
42 | Children = new string[] { "taska", "taskb", "taskc" },
43 | Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
44 | Deadline = DateTime.Now,
45 | Tags = new string[] { "tag1", "tag2", "tag3", "tag4", "tag5" }
46 | };
47 | }
48 |
49 | private static void evaluateProblem(String name, Action method)
50 | {
51 | var watch = System.Diagnostics.Stopwatch.StartNew();
52 | method();
53 | watch.Stop();
54 |
55 | var elapsedMs = watch.ElapsedMilliseconds;
56 | var timeInterval = elapsedMs / 1000.0;
57 |
58 | Console.WriteLine($" {name}: {timeInterval} seconds");
59 | }
60 |
61 | static void Main(string[] args)
62 | {
63 | var entity = GetObject();
64 | var list = GetTasks();
65 |
66 | var entityJson = JsonConvert.SerializeObject(entity);
67 | var listJson = JsonConvert.SerializeObject(list);
68 |
69 | Console.WriteLine("Running benchmarks for .NET Core:");
70 |
71 | evaluateProblem("#1 Encoding (single object)", () => {
72 | for(int i = 1; i <= 10000; ++i) {
73 | JsonConvert.SerializeObject(entity);
74 | }
75 | });
76 |
77 | evaluateProblem("#2 Encoding (list of objects)", () => {
78 | for(int i = 1; i <= 10000; ++i) {
79 | JsonConvert.SerializeObject(list);
80 | }
81 | });
82 |
83 | evaluateProblem("#3 Decoding (single object)", () => {
84 | for(int i = 1; i <= 10000; ++i) {
85 | JsonConvert.DeserializeObject(entityJson);
86 | }
87 | });
88 |
89 | evaluateProblem("#4 Decoding (list of objects)", () => {
90 | for(int i = 1; i <= 10000; ++i) {
91 | JsonConvert.DeserializeObject(listJson);
92 | }
93 | });
94 | }
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/NetCore/TaskDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace NetCore
4 | {
5 | class TaskDto
6 | {
7 | public String Id { get; set; }
8 | public DateTime CreateDate { get; set; }
9 | public String Name { get; set; }
10 | public bool IsFinished { get; set; }
11 | public int Subtasks { get; set; }
12 | public double Weight { get; set; }
13 | public String[] Children { get; set; }
14 | public String Description { get; set; }
15 | public DateTime Deadline { get; set; }
16 | public String[] Tags { get; set; }
17 | }
18 | }
--------------------------------------------------------------------------------
/ObjectMapper/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:4.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Benchmark",
8 | dependencies: [
9 | .package(url: "https://github.com/Hearst-DD/ObjectMapper.git", from: "3.4.2")
10 | ],
11 | targets: [
12 | .target(name: "Benchmark", dependencies: ["ObjectMapper"]),
13 | ]
14 | )
15 |
--------------------------------------------------------------------------------
/ObjectMapper/Sources/Benchmark/TaskDto.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import ObjectMapper
3 |
4 | class TaskClassDto: Mappable {
5 |
6 | public var id: String?
7 | public var createDate: Date?
8 | public var name: String
9 | public var isFinished: Bool
10 | public var subtasks: Int
11 | public var weight: Double
12 | public var children: [String]?
13 | public var description: String?
14 | public var deadline: Date?
15 | public var tags: [String]?
16 |
17 | required init() {
18 | self.id = nil
19 | self.createDate = nil
20 | self.name = ""
21 | self.isFinished = false
22 | self.subtasks = 0
23 | self.weight = 1.0
24 | self.children = nil
25 | self.description = ""
26 | self.deadline = nil
27 | self.tags = nil
28 | }
29 |
30 | required init?(map: Map) {
31 | self.id = nil
32 | self.createDate = nil
33 | self.name = ""
34 | self.isFinished = false
35 | self.subtasks = 0
36 | self.weight = 1.0
37 | self.children = nil
38 | self.description = ""
39 | self.deadline = nil
40 | self.tags = nil
41 | }
42 |
43 | func mapping(map: Map) {
44 | self.id <- map["id"]
45 | self.createDate <- (map["createDate"], ISO8601DateTransform())
46 | self.name <- map["name"]
47 | self.isFinished <- map["isFinished"]
48 | self.subtasks <- map["subtasks"]
49 | self.weight <- map["weight"]
50 | self.children <- map["children"]
51 | self.description <- map["description"]
52 | self.deadline <- (map["deadline"], ISO8601DateTransform())
53 | self.tags <- map["tags"]
54 | }
55 |
56 | init(
57 | id: String,
58 | createDate: Date,
59 | name: String,
60 | isFinished: Bool,
61 | subtasks: Int,
62 | weight: Double,
63 | children: [String],
64 | description: String?,
65 | deadline: Date?,
66 | tags: [String]?
67 | ) {
68 | self.id = id
69 | self.createDate = createDate
70 | self.name = name
71 | self.isFinished = isFinished
72 | self.subtasks = subtasks
73 | self.weight = weight
74 | self.children = children
75 | self.description = description
76 | self.deadline = deadline
77 | self.tags = tags
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/ObjectMapper/Sources/Benchmark/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import ObjectMapper
3 |
4 | func evaluateProblem(_ name: String, method: () -> Void) {
5 |
6 | let start = DispatchTime.now()
7 | method()
8 | let end = DispatchTime.now()
9 |
10 | let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
11 | let timeInterval = Double(nanoTime) / 1_000_000_000
12 |
13 | print(" \(name): \(timeInterval) seconds")
14 | }
15 |
16 | func getList() -> [TaskClassDto] {
17 | let currentDate = Date()
18 | var list: [TaskClassDto] = []
19 | for i in 1...100 {
20 | list.append(
21 | TaskClassDto(
22 | id: UUID().uuidString,
23 | createDate: currentDate,
24 | name: "Task \(i)",
25 | isFinished: false,
26 | subtasks: 212,
27 | weight: 3.14,
28 | children: ["taska", "taskb", "taskc"],
29 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
30 | deadline: currentDate,
31 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
32 | )
33 | )
34 | }
35 |
36 | return list
37 | }
38 |
39 | func getObject() -> TaskClassDto {
40 | return TaskClassDto(
41 | id: UUID().uuidString,
42 | createDate: Date(),
43 | name: "Task 1",
44 | isFinished: false,
45 | subtasks: 212,
46 | weight: 3.14,
47 | children: ["taska", "taskb", "taskc"],
48 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
49 | deadline: Date(),
50 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
51 | )
52 | }
53 |
54 | var entityJson = TaskJson.getTaskJson()
55 | var listJson = TaskJson.getTasksJson()
56 |
57 | var entity = getObject()
58 | var list = getList()
59 |
60 | print("Running benchmarks for ObjectMapper:")
61 |
62 | // Encoding single object 10,000 times.
63 | evaluateProblem("#1 Encoding (single object)") {
64 | for _ in 1...10_000 {
65 | _ = entity.toJSONString()
66 | }
67 | }
68 |
69 | // Encoding list of objects 10,000 times.
70 | evaluateProblem("#2 Encoding (list of objects)") {
71 | for _ in 1...10_000 {
72 | _ = list.toJSONString()
73 | }
74 | }
75 |
76 | // Decoding single object 10,000 times.
77 | evaluateProblem("#3 Decoding (single object)") {
78 | for _ in 1...10_000 {
79 | _ = TaskClassDto(JSONString: entityJson)
80 | }
81 | }
82 |
83 | // Decoding list of objects 10,000 times.
84 | evaluateProblem("#4 Decoding (list of objects)") {
85 | for _ in 1...10_000 {
86 | _ = Mapper().mapArray(JSONString: listJson)
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/PMJSON/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:4.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Benchmark",
8 | dependencies: [
9 | .package(url: "https://github.com/postmates/PMJSON.git", from: "3.1.2")
10 | ],
11 | targets: [
12 | .target(name: "Benchmark", dependencies: ["PMJSON"]),
13 | ]
14 | )
15 |
--------------------------------------------------------------------------------
/PMJSON/Sources/Benchmark/TaskDto.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import PMJSON
3 |
4 | class TaskClassDto: Encodable, Decodable {
5 |
6 | public var id: String?
7 | public var createDate: Date?
8 | public var name: String
9 | public var isFinished: Bool
10 | public var subtasks: Int
11 | public var weight: Double
12 | public var children: [String]?
13 | public var description: String?
14 | public var deadline: Date?
15 | public var tags: [String]?
16 |
17 | required init() {
18 | self.id = nil
19 | self.createDate = nil
20 | self.name = ""
21 | self.isFinished = false
22 | self.subtasks = 0
23 | self.weight = 1.0
24 | self.children = nil
25 | self.description = ""
26 | self.deadline = nil
27 | self.tags = nil
28 | }
29 |
30 | init(
31 | id: String,
32 | createDate: Date,
33 | name: String,
34 | isFinished: Bool,
35 | subtasks: Int,
36 | weight: Double,
37 | children: [String],
38 | description: String?,
39 | deadline: Date?,
40 | tags: [String]?
41 | ) {
42 | self.id = id
43 | self.createDate = createDate
44 | self.name = name
45 | self.isFinished = isFinished
46 | self.subtasks = subtasks
47 | self.weight = weight
48 | self.children = children
49 | self.description = description
50 | self.deadline = deadline
51 | self.tags = tags
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/PMJSON/Sources/Benchmark/TaskJson.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | class TaskJson {
4 |
5 | class func getTaskJson() -> String {
6 | return "{\"id\":\"e24e39c2-7b96-4a16-8cb6-bb96239171e5\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 1\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]}"
7 | }
8 |
9 | class func getTasksJson() -> String {
10 | return "[{\"id\":\"e24e39c2-7b96-4a16-8cb6-bb96239171e5\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 1\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"74098490-2c42-4d7e-a0e6-c341bda82359\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 2\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"a221197d-af7f-4117-880a-d26019b58fc5\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 3\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"9c49b2de-3ab6-4c8a-86ed-d1928f3b53e7\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 4\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"bdbbb6cb-fbdb-4071-a484-5dd9b2017619\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 5\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"a4837b7e-9a54-46f3-98e7-306053c0e44a\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 6\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"cc995ce9-87da-4ad5-8bcb-f4399f7763cf\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 7\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7df16a59-bcc8-40df-a9bb-badeb8c19e6b\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 8\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"d395bd06-d57b-4b59-be41-ae5bf658f2e8\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 9\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"a932b7fa-fc0d-4170-82d6-4bfbc4e2bd47\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 10\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7343731e-b1f8-4bbb-9bfb-2a18367e0c6b\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 11\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"c11b2b5a-b5ba-4e71-8eda-f8008963506c\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 12\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"66973ae3-3c74-4d64-aeeb-07b02cc4b21e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 13\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"2e3a3001-206f-413e-83a6-a87ea34f2bcd\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 14\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"4ac2b83a-4da5-484a-ab8a-679c179119ad\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 15\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7827ce07-72b8-4a91-a0fa-df156720479b\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 16\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"25638d89-74c0-491a-a061-54dd1232ac8e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 17\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"02f87383-a20d-4adb-8e52-515efb495349\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 18\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"2df94ea2-44b0-4399-a49c-5469d29dbbef\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 19\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"3db0ec14-dbb0-46af-bee1-4ad387a74ab5\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 20\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"4bb5dae9-ba5c-4bfe-9357-8d968972a5b6\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 21\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"139db938-0680-4cf6-b562-be285a5fb7e3\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 22\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"54bc379c-81ff-4dbe-a3f5-34114d678ec0\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 23\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"5856c926-c9f5-408c-aa9c-0fd8f8a03ed4\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 24\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"83620820-8535-42cc-ac87-34332f7fd71d\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 25\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7c74cb72-fc67-47f5-bcc0-7e57ac4b3fce\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 26\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"6c46062f-5e4a-4aab-80be-3c80982c39f7\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 27\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"098927ca-2b35-4c38-95c2-eef3108ef738\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 28\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"6239a8fc-1fd7-410c-918f-c5c9ae31c6fe\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 29\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"c0b92c2a-24a8-4cb3-b183-79f1d1770487\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 30\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"f9885a6c-f756-4be7-b220-598819f9641e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 31\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e62af9c0-269b-46db-ab47-292e1d32124f\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 32\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"c0d41181-3ed8-4208-82dd-70f10305a9c3\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 33\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"a7e8a168-0dab-46c4-92ba-15ff53ae5cc0\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 34\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"00e5e039-af88-4925-ba03-c32b79d81904\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 35\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"466b9836-293b-4d14-a7a2-389d0c3dcec1\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 36\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7e7afbf5-5772-4df5-a074-fdccc802534e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 37\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"72c87a42-053c-4e35-b444-3b780f722a73\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 38\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"786eca4b-de11-4466-8360-babc1c3b59a3\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 39\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7ce2e70b-7732-46cc-8b3c-73e89c9dad8f\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 40\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"fd25b7bb-ab7e-4980-89c6-37442497daac\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 41\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"3c936075-cfc2-4bf9-b65c-86b0422a88fa\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 42\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"0cdfda5e-5d02-438c-a2ec-d044330400c4\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 43\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"d15883e2-305b-45b5-b1d6-93daf13f82c2\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 44\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"f4011578-724d-4f07-8050-a28b5e893048\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 45\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"6ade7f44-ec70-45ac-9964-706f07257b91\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 46\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"2f571214-305f-4b85-9758-59606a163936\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 47\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e2b18520-d20d-4304-b054-b7ac2e5bcc24\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 48\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"6b392db4-4306-42a5-b730-958c53f53723\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 49\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"0878f7f3-3d83-4182-9fb5-1721f975de1e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 50\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"ca68ecdd-4aa5-4e34-b7f7-503afc902bc5\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 51\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e0becaac-de0d-4f42-bb5d-5973078328ea\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 52\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"bb7ea8dd-06c3-4494-a542-d7180a85eed4\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 53\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e8a37099-c7da-4e20-9c0d-74809d2c01ad\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 54\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"408608c5-bebd-4db8-ae0d-50dc48c9561d\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 55\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"58ecb29a-c9da-495c-b162-00ad8bcb1cbc\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 56\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"8da32663-f7f1-45f0-85b3-c7f130b17cbd\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 57\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"77fd08ad-9cc1-443e-bceb-0090c079ba74\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 58\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"96f01b8d-b3d9-4698-a4c7-040517108de6\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 59\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e1bde625-db13-4de0-ba61-66956ca9de60\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 60\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"71fd535a-763a-4cc4-a26c-92d7b3fbc486\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 61\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"c0076c87-9b65-4001-84ad-e4c9f0cd86a3\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 62\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e417efc4-e173-4c8e-8126-74031d77e1e5\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 63\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"2724da54-3c13-42de-acad-f741890982f6\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 64\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"b5d7ffc5-c062-406a-9802-e69c62b8ccac\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 65\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"10efad1f-e3c9-4bf6-b168-4cd9c0b2595d\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 66\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"f9d1eec6-3426-49ce-a557-3466e50d3444\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 67\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"dc9999be-5fa8-4bc9-94d3-545b735c014c\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 68\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"56d21286-affe-4005-b8de-d618ce3b8809\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 69\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"adcc9b1b-c8ef-42ac-b5b8-b2d853f5202c\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 70\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"04b9177d-aeaf-44d6-a334-aee46c6c6d56\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 71\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"4412efed-ce45-4da7-b7d9-33bee0602a81\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 72\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"15b642ad-7741-45a7-a133-23d74c44fd02\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 73\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"9d2700f5-70d2-45c3-98c8-7ee1b94e977d\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 74\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"d46e13c2-e32e-4100-8db7-a86e6a179d6e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 75\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"08f41455-9376-4f92-887d-74b372e41f19\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 76\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"f633773e-de68-4a83-b2bf-75c23d1c1b86\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 77\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"579c93d1-fcbe-47a6-9fe0-720385635bfc\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 78\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"8a5e37d3-9b05-4fca-a1f6-078a376b7170\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 79\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"9cfe7810-9b9b-49d4-b91e-1f839af38eb1\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 80\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"7bdf4940-bf5f-4d70-90cc-24281b8cb1c6\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 81\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"572165d5-e8d2-4244-bd03-4ecbbb1dd4ae\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 82\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e901f15b-c2f4-4e7c-ba9f-594941b3ad90\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 83\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"5f8c08c8-97a0-4b62-9995-8c25c304797c\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 84\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"4c0cb93e-6b34-4467-8126-2ad3669270f7\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 85\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"9ce5a718-b946-4d1f-89b5-744682cdc4ca\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 86\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"4587120d-b458-4a88-815a-9ff35be15b18\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 87\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"e06a8879-ff6e-45c2-bbf5-4d99e0e060ef\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 88\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"bfce8afa-3bd8-41bd-a6b9-014303a8ca7c\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 89\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"32cb4b15-99fb-4ab1-a615-8ea05182b7ac\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 90\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"cba68bd6-a996-46c4-9ffd-db2a1430edf9\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 91\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"8dafc793-a676-45ef-a5db-a3c249c16261\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 92\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"77ebad9c-e260-4f36-ab29-abfaa5401a4b\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 93\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"69a4c372-c222-4762-a4c6-1e5e568d4b51\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 94\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"1fba9ffc-0b75-45f2-84fd-2591ef43623f\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 95\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"ff9c65fa-9c8c-4053-9e55-878cebf03436\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 96\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"742ad446-73f9-4e67-82b9-7c59319e851d\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 97\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"f311451d-8629-41ee-956f-1888d2be5924\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 98\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"eed11393-2b1c-404f-9e36-ac1dff76d56a\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 99\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]},{\"id\":\"a31cbc74-39bf-4b6a-8bcb-8c31ca236b8e\",\"createDate\":\"2009-02-15T00:00:00Z\",\"name\":\"Task 100\",\"isFinished\":false,\"subtasks\":212,\"weight\":3.14,\"children\":[\"taska\",\"taskb\",\"taskc\"],\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.\",\"deadline\":\"2019-02-15T01:10:00Z\",\"tags\":[\"tag1\",\"tag2\",\"tag3\",\"tag4\",\"tag5\"]}]"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/PMJSON/Sources/Benchmark/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import PMJSON
3 |
4 | func evaluateProblem(_ name: String, method: () -> Void) {
5 |
6 | let start = DispatchTime.now()
7 | method()
8 | let end = DispatchTime.now()
9 |
10 | let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
11 | let timeInterval = Double(nanoTime) / 1_000_000_000
12 |
13 | print(" \(name): \(timeInterval) seconds")
14 | }
15 |
16 | func getList() -> [TaskClassDto] {
17 | let currentDate = Date()
18 | var list: [TaskClassDto] = []
19 | for i in 1...100 {
20 | list.append(
21 | TaskClassDto(
22 | id: UUID().uuidString,
23 | createDate: currentDate,
24 | name: "Task \(i)",
25 | isFinished: false,
26 | subtasks: 212,
27 | weight: 3.14,
28 | children: ["taska", "taskb", "taskc"],
29 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
30 | deadline: currentDate,
31 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
32 | )
33 | )
34 | }
35 |
36 | return list
37 | }
38 |
39 | func getObject() -> TaskClassDto {
40 | return TaskClassDto(
41 | id: UUID().uuidString,
42 | createDate: Date(),
43 | name: "Task 1",
44 | isFinished: false,
45 | subtasks: 212,
46 | weight: 3.14,
47 | children: ["taska", "taskb", "taskc"],
48 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis.",
49 | deadline: Date(),
50 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
51 | )
52 | }
53 |
54 | var entityJson = TaskJson.getTaskJson()
55 | var listJson = TaskJson.getTasksJson()
56 |
57 | var entity = getObject()
58 | var list = getList()
59 |
60 | print("Running benchmarks for PMJSON:")
61 |
62 | // Encoding single object 10,000 times.
63 | evaluateProblem("#1 Encoding (single object)") {
64 | var encoder = JSON.Encoder()
65 | encoder.dateEncodingStrategy = .iso8601
66 |
67 | do {
68 | for _ in 1...10_000 {
69 | _ = try encoder.encodeAsString(entity)
70 | }
71 | } catch {
72 | print("Error during serialization object to JSON: \(error)")
73 | }
74 | }
75 |
76 | // Encoding list of objects 10,000 times.
77 | evaluateProblem("#2 Encoding (list of objects)") {
78 | var encoder = JSON.Encoder()
79 | encoder.dateEncodingStrategy = .iso8601
80 |
81 | do {
82 | for _ in 1...10_000 {
83 | _ = try encoder.encodeAsString(list)
84 | }
85 | } catch {
86 | print("Error during serialization object to JSON: \(error)")
87 | }
88 | }
89 |
90 | // Decoding single object 10,000 times.
91 | evaluateProblem("#3 Decoding (single object)") {
92 | var decoder = JSON.Decoder()
93 | decoder.dateDecodingStrategy = .iso8601
94 |
95 | do {
96 | for _ in 1...10_000 {
97 | _ = try decoder.decode(TaskClassDto.self, from: entityJson)
98 | }
99 | } catch {
100 | print("Error during deserialization object from JSON: \(error)")
101 | }
102 | }
103 |
104 | // Decoding list of objects 10,000 times.
105 | evaluateProblem("#4 Decoding (list of objects)") {
106 | var decoder = JSON.Decoder()
107 | decoder.dateDecodingStrategy = .iso8601
108 |
109 | do {
110 | for _ in 1...10_000 {
111 | _ = try decoder.decode([TaskClassDto].self, from: listJson)
112 | }
113 | } catch {
114 | print("Error during deserialization object from JSON: \(error)")
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/Performance/Statystyki-wydajnosc.md:
--------------------------------------------------------------------------------
1 | # Health (benchmark 001)
2 |
3 | ## MacBook Pro 13
4 |
5 | **Swift**
6 |
7 | ```bash
8 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/health
9 | ```
10 |
11 | ```
12 | Running 10m test @ https://taskerswift.azurewebsites.net/health
13 | 4 threads and 20 connections
14 | Thread Stats Avg Stdev Max +/- Stdev
15 | Latency 56.41ms 16.57ms 1.11s 97.56%
16 | Req/Sec 89.82 12.27 121.00 87.22%
17 | 214499 requests in 10.00m, 65.05MB read
18 | Requests/sec: 357.43
19 | Transfer/sec: 111.00KB
20 | ```
21 |
22 | **ASP.NET Core**
23 |
24 | ```bSH
25 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/health
26 | ```
27 |
28 | ```
29 | Running 10m test @ https://taskercore.azurewebsites.net/health
30 | 4 threads and 20 connections
31 | Thread Stats Avg Stdev Max +/- Stdev
32 | Latency 69.47ms 19.92ms 890.17ms 89.43%
33 | Req/Sec 72.97 16.80 111.00 64.37%
34 | 173950 requests in 10.00m, 55.75MB read
35 | Requests/sec: 289.89
36 | Transfer/sec: 95.13KB
37 | ```
38 |
39 | ## Ubuntu on Azure
40 |
41 | **Swift**
42 |
43 | ```bash
44 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/health
45 | ```
46 |
47 | ```
48 | Running 10m test @ https://taskerswift.azurewebsites.net/health
49 | 4 threads and 20 connections
50 | Thread Stats Avg Stdev Max +/- Stdev
51 | Latency 29.32ms 7.02ms 307.62ms 91.57%
52 | Req/Sec 171.82 26.71 222.00 81.21%
53 | 411057 requests in 10.00m, 124.66MB read
54 | Requests/sec: 685.01
55 | Transfer/sec: 212.73KB
56 | ```
57 |
58 | **ASP.NET Core**
59 |
60 | ```bash
61 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/health
62 | ```
63 |
64 | ```
65 | Running 10m test @ https://taskercore.azurewebsites.net/health
66 | 4 threads and 20 connections
67 | Thread Stats Avg Stdev Max +/- Stdev
68 | Latency 45.53ms 20.87ms 1.08s 85.01%
69 | Req/Sec 112.04 26.90 210.00 66.89%
70 | 267674 requests in 10.00m, 85.79MB read
71 | Requests/sec: 446.06
72 | Transfer/sec: 146.38KB
73 | ```
74 |
75 | ## Chart
76 |
77 | 
78 |
79 | ```json
80 | {
81 | "type": "serial",
82 | "categoryField": "category",
83 | "theme": "dark",
84 | "categoryAxis": {},
85 | "trendLines": [],
86 | "graphs": [
87 | {
88 | "balloonText": "[[title]] of [[category]]:[[value]]",
89 | "fillAlphas": 1,
90 | "id": "AmGraph-1",
91 | "title": "Swift",
92 | "type": "column",
93 | "valueField": "Swift"
94 | },
95 | {
96 | "balloonText": "[[title]] of [[category]]:[[value]]",
97 | "fillAlphas": 1,
98 | "id": "AmGraph-2",
99 | "title": "ASP.NET Core",
100 | "type": "column",
101 | "valueField": "ASP.NET Core"
102 | }
103 | ],
104 | "guides": [],
105 | "valueAxes": [
106 | {
107 | "id": "ValueAxis-1",
108 | "minimum": 0,
109 | "title": "Requests (10 minutes)"
110 | }
111 | ],
112 | "allLabels": [],
113 | "balloon": {},
114 | "legend": {
115 | "enabled": true,
116 | "useGraphSettings": true
117 | },
118 | "titles": [
119 | {
120 | "id": "Title-1",
121 | "size": 15,
122 | "text": "Benchmark #1"
123 | }
124 | ],
125 | "dataProvider": [
126 | {
127 | "category": "MacBook Pro",
128 | "Swift": "214499",
129 | "ASP.NET Core": "173950"
130 | },
131 | {
132 | "category": "Ubuntu (Azure)",
133 | "Swift": "411057",
134 | "ASP.NET Core": "267674"
135 | }
136 | ]
137 | }
138 | ```
139 |
140 | # List - Swift with Perfect CRUD (benchmark 002)
141 |
142 | ## MacBook Pro
143 |
144 | **Swift**
145 |
146 | ```bash
147 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MjM3MjUyNDUuNzAzMjYsIm5hbWUiOiJtYXJ0aW4uZG9lQGVtYWlsLmNvbSIsImlzcyI6InRhc2tlci1zZXJ2ZXItaXNzdWVyIiwiaWF0IjoxNTIzNjg5MjQ1LjcwMzI2LCJ1aWQiOiIxMEM0MjkyOS0zRjdFLTQ2QjYtODE2RS01NTQwOERBOUY0OTAiLCJyb2xlcyI6W119.dF-g61nLBvpeM3WUlczhTCskVMrYnifE3__IfVmrA10"
148 | ```
149 |
150 | ```
151 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
152 | 4 threads and 20 connections
153 | Thread Stats Avg Stdev Max +/- Stdev
154 | Latency 1.28s 114.55ms 2.00s 73.25%
155 | Req/Sec 4.81 3.21 20.00 59.63%
156 | 9368 requests in 10.00m, 100.78MB read
157 | Socket errors: connect 0, read 0, write 0, timeout 21
158 | Requests/sec: 15.61
159 | Transfer/sec: 171.98KB
160 | ```
161 |
162 | **ASP.NET Core**
163 |
164 | ```bash
165 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
166 | ```
167 |
168 | ```
169 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
170 | 4 threads and 20 connections
171 | Thread Stats Avg Stdev Max +/- Stdev
172 | Latency 208.81ms 117.32ms 1.25s 84.94%
173 | Req/Sec 26.55 12.43 79.00 58.23%
174 | 60193 requests in 10.00m, 695.40MB read
175 | Requests/sec: 100.30
176 | Transfer/sec: 1.16MB
177 | ```
178 |
179 | ## Ubuntu (Azure)
180 |
181 | **Swift**
182 |
183 | ```bash
184 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJEMTE4NkI0NS04OTVDLTQ5QjAtQkFGOS1DQzMxRUUzM0E5RkMiLCJpYXQiOjE1MjM2OTM0MDcuMjYxNjgsInJvbGVzIjpbXSwibmFtZSI6Im1hcnRpbi5kb2VAZW1haWwuY29tIiwiaXNzIjoidGFza2VyLXNlcnZlci1pc3N1ZXIiLCJleHAiOjE1MjM3Mjk0MDcuMjYxNjl9.Em_hlFmpna4XWUnIG5WObyI3phzoGOyIIQmlIeuKbE4"
185 | ```
186 |
187 |
188 | ```
189 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
190 | 4 threads and 20 connections
191 | Thread Stats Avg Stdev Max +/- Stdev
192 | Latency 1.34s 101.03ms 1.99s 77.65%
193 | Req/Sec 6.29 4.33 20.00 79.62%
194 | 8951 requests in 10.00m, 96.30MB read
195 | Socket errors: connect 0, read 0, write 0, timeout 15
196 | Requests/sec: 14.92
197 | Transfer/sec: 164.34KB
198 | ```
199 |
200 | **ASP.NET Core**
201 |
202 | ```bash
203 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
204 | ```
205 |
206 | ```
207 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
208 | 4 threads and 20 connections
209 | Thread Stats Avg Stdev Max +/- Stdev
210 | Latency 193.72ms 51.93ms 1.01s 86.83%
211 | Req/Sec 26.39 10.45 90.00 63.50%
212 | 62260 requests in 10.00m, 719.11MB read
213 | Requests/sec: 103.75
214 | Transfer/sec: 1.20MB
215 | ```
216 |
217 | ### Chart
218 |
219 | 
220 |
221 | ```json
222 | {
223 | "type": "serial",
224 | "categoryField": "category",
225 | "theme": "dark",
226 | "categoryAxis": {},
227 | "trendLines": [],
228 | "graphs": [
229 | {
230 | "balloonText": "[[title]] of [[category]]:[[value]]",
231 | "fillAlphas": 1,
232 | "id": "AmGraph-1",
233 | "title": "Swift",
234 | "type": "column",
235 | "valueField": "Swift"
236 | },
237 | {
238 | "balloonText": "[[title]] of [[category]]:[[value]]",
239 | "fillAlphas": 1,
240 | "id": "AmGraph-2",
241 | "title": "ASP.NET Core",
242 | "type": "column",
243 | "valueField": "ASP.NET Core"
244 | }
245 | ],
246 | "guides": [],
247 | "valueAxes": [
248 | {
249 | "id": "ValueAxis-1",
250 | "minimum": 0,
251 | "title": "Requests (10 minutes)"
252 | }
253 | ],
254 | "allLabels": [],
255 | "balloon": {},
256 | "legend": {
257 | "enabled": true,
258 | "useGraphSettings": true
259 | },
260 | "titles": [
261 | {
262 | "id": "Title-1",
263 | "size": 15,
264 | "text": "Benchmark #2"
265 | }
266 | ],
267 | "dataProvider": [
268 | {
269 | "category": "MacBook Pro",
270 | "Swift": "9368",
271 | "ASP.NET Core": "60193"
272 | },
273 | {
274 | "category": "Ubuntu (Azure)",
275 | "Swift": "8951",
276 | "ASP.NET Core": "62260"
277 | }
278 | ]
279 | }
280 | ```
281 |
282 | # List - Swift without SQLite (benchmark 003)
283 |
284 | ## MacBook Pro
285 |
286 | **Swift**
287 |
288 | ```bash
289 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MjM3MjUyNDUuNzAzMjYsIm5hbWUiOiJtYXJ0aW4uZG9lQGVtYWlsLmNvbSIsImlzcyI6InRhc2tlci1zZXJ2ZXItaXNzdWVyIiwiaWF0IjoxNTIzNjg5MjQ1LjcwMzI2LCJ1aWQiOiIxMEM0MjkyOS0zRjdFLTQ2QjYtODE2RS01NTQwOERBOUY0OTAiLCJyb2xlcyI6W119.dF-g61nLBvpeM3WUlczhTCskVMrYnifE3__IfVmrA10"
290 | ```
291 |
292 | ```
293 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
294 | 4 threads and 20 connections
295 | Thread Stats Avg Stdev Max +/- Stdev
296 | Latency 215.63ms 185.10ms 1.94s 66.70%
297 | Req/Sec 11.66 5.20 40.00 64.87%
298 | 19549 requests in 10.88m, 215.82MB read
299 | Socket errors: connect 0, read 6, write 0, timeout 1
300 | Requests/sec: 29.96
301 | Transfer/sec: 338.66KB
302 | ```
303 |
304 | **ASP.NET Core**
305 |
306 | ```bash
307 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
308 | ```
309 |
310 | ```
311 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
312 | 4 threads and 20 connections
313 | Thread Stats Avg Stdev Max +/- Stdev
314 | Latency 208.81ms 117.32ms 1.25s 84.94%
315 | Req/Sec 26.55 12.43 79.00 58.23%
316 | 60193 requests in 10.00m, 695.40MB read
317 | Requests/sec: 100.30
318 | Transfer/sec: 1.16MB
319 | ```
320 |
321 | ## Ubuntu (Azure)
322 |
323 | **Swift**
324 |
325 | ```bash
326 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJEMTE4NkI0NS04OTVDLTQ5QjAtQkFGOS1DQzMxRUUzM0E5RkMiLCJpYXQiOjE1MjM2OTM0MDcuMjYxNjgsInJvbGVzIjpbXSwibmFtZSI6Im1hcnRpbi5kb2VAZW1haWwuY29tIiwiaXNzIjoidGFza2VyLXNlcnZlci1pc3N1ZXIiLCJleHAiOjE1MjM3Mjk0MDcuMjYxNjl9.Em_hlFmpna4XWUnIG5WObyI3phzoGOyIIQmlIeuKbE4"
327 | ```
328 |
329 |
330 | ```
331 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
332 | 4 threads and 20 connections
333 | Thread Stats Avg Stdev Max +/- Stdev
334 | Latency 469.01ms 53.63ms 1.19s 88.66%
335 | Req/Sec 11.52 4.85 30.00 65.58%
336 | 25586 requests in 10.00m, 282.46MB read
337 | Requests/sec: 42.64
338 | Transfer/sec: 482.00KB
339 | ```
340 |
341 | **ASP.NET Core**
342 |
343 | ```bash
344 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
345 | ```
346 |
347 | ```
348 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
349 | 4 threads and 20 connections
350 | Thread Stats Avg Stdev Max +/- Stdev
351 | Latency 193.72ms 51.93ms 1.01s 86.83%
352 | Req/Sec 26.39 10.45 90.00 63.50%
353 | 62260 requests in 10.00m, 719.11MB read
354 | Requests/sec: 103.75
355 | Transfer/sec: 1.20MB
356 | ```
357 |
358 | ### Chart
359 |
360 | 
361 |
362 | ```json
363 | {
364 | "type": "serial",
365 | "categoryField": "category",
366 | "theme": "dark",
367 | "categoryAxis": {},
368 | "trendLines": [],
369 | "graphs": [
370 | {
371 | "balloonText": "[[title]] of [[category]]:[[value]]",
372 | "fillAlphas": 1,
373 | "id": "AmGraph-1",
374 | "title": "Swift",
375 | "type": "column",
376 | "valueField": "Swift"
377 | },
378 | {
379 | "balloonText": "[[title]] of [[category]]:[[value]]",
380 | "fillAlphas": 1,
381 | "id": "AmGraph-2",
382 | "title": "ASP.NET Core",
383 | "type": "column",
384 | "valueField": "ASP.NET Core"
385 | }
386 | ],
387 | "guides": [],
388 | "valueAxes": [
389 | {
390 | "id": "ValueAxis-1",
391 | "minimum": 0,
392 | "title": "Requests (10 minutes)"
393 | }
394 | ],
395 | "allLabels": [],
396 | "balloon": {},
397 | "legend": {
398 | "enabled": true,
399 | "useGraphSettings": true
400 | },
401 | "titles": [
402 | {
403 | "id": "Title-1",
404 | "size": 15,
405 | "text": "Benchmark #3"
406 | }
407 | ],
408 | "dataProvider": [
409 | {
410 | "category": "MacBook Pro",
411 | "Swift": "19549",
412 | "ASP.NET Core": "60193"
413 | },
414 | {
415 | "category": "Ubuntu (Azure)",
416 | "Swift": "25586",
417 | "ASP.NET Core": "62260"
418 | }
419 | ]
420 | }
421 | ```
422 |
423 | # List - Swift without Services/Repositories with encoding fixes (benchmark 004)
424 |
425 | ## MacBook Pro
426 |
427 | **Swift**
428 |
429 | ```bash
430 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MjM3MjUyNDUuNzAzMjYsIm5hbWUiOiJtYXJ0aW4uZG9lQGVtYWlsLmNvbSIsImlzcyI6InRhc2tlci1zZXJ2ZXItaXNzdWVyIiwiaWF0IjoxNTIzNjg5MjQ1LjcwMzI2LCJ1aWQiOiIxMEM0MjkyOS0zRjdFLTQ2QjYtODE2RS01NTQwOERBOUY0OTAiLCJyb2xlcyI6W119.dF-g61nLBvpeM3WUlczhTCskVMrYnifE3__IfVmrA10"
431 | ```
432 |
433 | ```
434 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
435 | 4 threads and 20 connections
436 | Thread Stats Avg Stdev Max +/- Stdev
437 | Latency 398.24ms 51.55ms 1.46s 85.83%
438 | Req/Sec 13.35 7.28 40.00 80.32%
439 | 30124 requests in 10.00m, 332.56MB read
440 | Requests/sec: 50.20
441 | Transfer/sec: 567.48KB
442 | ```
443 |
444 | **ASP.NET Core**
445 |
446 | ```bash
447 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
448 | ```
449 |
450 | ```
451 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
452 | 4 threads and 20 connections
453 | Thread Stats Avg Stdev Max +/- Stdev
454 | Latency 208.81ms 117.32ms 1.25s 84.94%
455 | Req/Sec 26.55 12.43 79.00 58.23%
456 | 60193 requests in 10.00m, 695.40MB read
457 | Requests/sec: 100.30
458 | Transfer/sec: 1.16MB
459 | ```
460 |
461 | ## Ubuntu (Azure)
462 |
463 | **Swift**
464 |
465 | ```bash
466 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJEMTE4NkI0NS04OTVDLTQ5QjAtQkFGOS1DQzMxRUUzM0E5RkMiLCJpYXQiOjE1MjM2OTM0MDcuMjYxNjgsInJvbGVzIjpbXSwibmFtZSI6Im1hcnRpbi5kb2VAZW1haWwuY29tIiwiaXNzIjoidGFza2VyLXNlcnZlci1pc3N1ZXIiLCJleHAiOjE1MjM3Mjk0MDcuMjYxNjl9.Em_hlFmpna4XWUnIG5WObyI3phzoGOyIIQmlIeuKbE4"
467 | ```
468 |
469 |
470 | ```
471 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
472 | 4 threads and 20 connections
473 | Thread Stats Avg Stdev Max +/- Stdev
474 | Latency 400.59ms 52.31ms 1.35s 89.30%
475 | Req/Sec 13.05 5.26 30.00 65.64%
476 | 29969 requests in 10.00m, 330.85MB read
477 | Requests/sec: 49.94
478 | Transfer/sec: 564.56KB
479 | ```
480 |
481 | **ASP.NET Core**
482 |
483 | ```bash
484 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
485 | ```
486 |
487 | ```
488 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
489 | 4 threads and 20 connections
490 | Thread Stats Avg Stdev Max +/- Stdev
491 | Latency 193.72ms 51.93ms 1.01s 86.83%
492 | Req/Sec 26.39 10.45 90.00 63.50%
493 | 62260 requests in 10.00m, 719.11MB read
494 | Requests/sec: 103.75
495 | Transfer/sec: 1.20MB
496 | ```
497 |
498 | ### Chart
499 |
500 | 
501 |
502 | ```json
503 | {
504 | "type": "serial",
505 | "categoryField": "category",
506 | "theme": "dark",
507 | "categoryAxis": {},
508 | "trendLines": [],
509 | "graphs": [
510 | {
511 | "balloonText": "[[title]] of [[category]]:[[value]]",
512 | "fillAlphas": 1,
513 | "id": "AmGraph-1",
514 | "title": "Swift",
515 | "type": "column",
516 | "valueField": "Swift"
517 | },
518 | {
519 | "balloonText": "[[title]] of [[category]]:[[value]]",
520 | "fillAlphas": 1,
521 | "id": "AmGraph-2",
522 | "title": "ASP.NET Core",
523 | "type": "column",
524 | "valueField": "ASP.NET Core"
525 | }
526 | ],
527 | "guides": [],
528 | "valueAxes": [
529 | {
530 | "id": "ValueAxis-1",
531 | "minimum": 0,
532 | "title": "Requests (10 minutes)"
533 | }
534 | ],
535 | "allLabels": [],
536 | "balloon": {},
537 | "legend": {
538 | "enabled": true,
539 | "useGraphSettings": true
540 | },
541 | "titles": [
542 | {
543 | "id": "Title-1",
544 | "size": 15,
545 | "text": "Benchmark #4"
546 | }
547 | ],
548 | "dataProvider": [
549 | {
550 | "category": "MacBook Pro",
551 | "Swift": "30124",
552 | "ASP.NET Core": "60193"
553 | },
554 | {
555 | "category": "Ubuntu (Azure)",
556 | "Swift": "29969",
557 | "ASP.NET Core": "62260"
558 | }
559 | ]
560 | }
561 | ```
562 |
563 | # List - Swift only route with main.swift (benchmark 005)
564 |
565 | ## MacBook Pro
566 |
567 | **Swift**
568 |
569 | ```bash
570 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MjM3MjUyNDUuNzAzMjYsIm5hbWUiOiJtYXJ0aW4uZG9lQGVtYWlsLmNvbSIsImlzcyI6InRhc2tlci1zZXJ2ZXItaXNzdWVyIiwiaWF0IjoxNTIzNjg5MjQ1LjcwMzI2LCJ1aWQiOiIxMEM0MjkyOS0zRjdFLTQ2QjYtODE2RS01NTQwOERBOUY0OTAiLCJyb2xlcyI6W119.dF-g61nLBvpeM3WUlczhTCskVMrYnifE3__IfVmrA10"
571 | ```
572 |
573 | ```
574 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
575 | 4 threads and 20 connections
576 | Thread Stats Avg Stdev Max +/- Stdev
577 | Latency 385.52ms 74.88ms 1.50s 88.31%
578 | Req/Sec 13.57 6.94 49.00 84.76%
579 | 31155 requests in 10.00m, 342.98MB read
580 | Requests/sec: 51.92
581 | Transfer/sec: 585.26KB
582 | ```
583 |
584 | **ASP.NET Core**
585 |
586 | ```bash
587 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
588 | ```
589 |
590 | ```
591 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
592 | 4 threads and 20 connections
593 | Thread Stats Avg Stdev Max +/- Stdev
594 | Latency 208.81ms 117.32ms 1.25s 84.94%
595 | Req/Sec 26.55 12.43 79.00 58.23%
596 | 60193 requests in 10.00m, 695.40MB read
597 | Requests/sec: 100.30
598 | Transfer/sec: 1.16MB
599 | ```
600 |
601 | ## Ubuntu (Azure)
602 |
603 | **Swift**
604 |
605 | ```bash
606 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJEMTE4NkI0NS04OTVDLTQ5QjAtQkFGOS1DQzMxRUUzM0E5RkMiLCJpYXQiOjE1MjM2OTM0MDcuMjYxNjgsInJvbGVzIjpbXSwibmFtZSI6Im1hcnRpbi5kb2VAZW1haWwuY29tIiwiaXNzIjoidGFza2VyLXNlcnZlci1pc3N1ZXIiLCJleHAiOjE1MjM3Mjk0MDcuMjYxNjl9.Em_hlFmpna4XWUnIG5WObyI3phzoGOyIIQmlIeuKbE4"
607 | ```
608 |
609 | ```
610 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
611 | 4 threads and 20 connections
612 | Thread Stats Avg Stdev Max +/- Stdev
613 | Latency 376.99ms 47.72ms 1.11s 89.53%
614 | Req/Sec 14.03 6.15 40.00 89.11%
615 | 31840 requests in 10.00m, 350.52MB read
616 | Requests/sec: 53.06
617 | Transfer/sec: 598.12KB
618 | ```
619 |
620 | **ASP.NET Core**
621 |
622 | ```bash
623 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
624 | ```
625 |
626 | ```
627 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
628 | 4 threads and 20 connections
629 | Thread Stats Avg Stdev Max +/- Stdev
630 | Latency 193.72ms 51.93ms 1.01s 86.83%
631 | Req/Sec 26.39 10.45 90.00 63.50%
632 | 62260 requests in 10.00m, 719.11MB read
633 | Requests/sec: 103.75
634 | Transfer/sec: 1.20MB
635 | ```
636 |
637 | ### Chart
638 |
639 | 
640 |
641 | ```json
642 | {
643 | "type": "serial",
644 | "categoryField": "category",
645 | "theme": "dark",
646 | "categoryAxis": {},
647 | "trendLines": [],
648 | "graphs": [
649 | {
650 | "balloonText": "[[title]] of [[category]]:[[value]]",
651 | "fillAlphas": 1,
652 | "id": "AmGraph-1",
653 | "title": "Swift",
654 | "type": "column",
655 | "valueField": "Swift"
656 | },
657 | {
658 | "balloonText": "[[title]] of [[category]]:[[value]]",
659 | "fillAlphas": 1,
660 | "id": "AmGraph-2",
661 | "title": "ASP.NET Core",
662 | "type": "column",
663 | "valueField": "ASP.NET Core"
664 | }
665 | ],
666 | "guides": [],
667 | "valueAxes": [
668 | {
669 | "id": "ValueAxis-1",
670 | "minimum": 0,
671 | "title": "Requests (10 minutes)"
672 | }
673 | ],
674 | "allLabels": [],
675 | "balloon": {},
676 | "legend": {
677 | "enabled": true,
678 | "useGraphSettings": true
679 | },
680 | "titles": [
681 | {
682 | "id": "Title-1",
683 | "size": 15,
684 | "text": "Benchmark #5"
685 | }
686 | ],
687 | "dataProvider": [
688 | {
689 | "category": "MacBook Pro",
690 | "Swift": "31155",
691 | "ASP.NET Core": "60193"
692 | },
693 | {
694 | "category": "Ubuntu (Azure)",
695 | "Swift": "31840",
696 | "ASP.NET Core": "62260"
697 | }
698 | ]
699 | }
700 | ```
701 |
702 | # List - Faster server (S3 Standard 4Core)
703 |
704 | ## MacBook Pro
705 |
706 | **Swift**
707 |
708 | ```bash
709 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MjM3MjUyNDUuNzAzMjYsIm5hbWUiOiJtYXJ0aW4uZG9lQGVtYWlsLmNvbSIsImlzcyI6InRhc2tlci1zZXJ2ZXItaXNzdWVyIiwiaWF0IjoxNTIzNjg5MjQ1LjcwMzI2LCJ1aWQiOiIxMEM0MjkyOS0zRjdFLTQ2QjYtODE2RS01NTQwOERBOUY0OTAiLCJyb2xlcyI6W119.dF-g61nLBvpeM3WUlczhTCskVMrYnifE3__IfVmrA10"
710 | ```
711 |
712 | ```
713 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
714 | 4 threads and 20 connections
715 | Thread Stats Avg Stdev Max +/- Stdev
716 | Latency 89.52ms 19.93ms 1.36s 90.02%
717 | Req/Sec 56.11 10.27 101.00 73.67%
718 | 134385 requests in 10.00m, 1.44GB read
719 | Non-2xx or 3xx responses: 2
720 | Requests/sec: 223.95
721 | Transfer/sec: 2.47MB
722 | ```
723 |
724 | **ASP.NET Core**
725 |
726 | ```bash
727 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
728 | ```
729 |
730 | ```
731 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
732 | 4 threads and 20 connections
733 | Thread Stats Avg Stdev Max +/- Stdev
734 | Latency 65.34ms 17.29ms 1.36s 95.44%
735 | Req/Sec 77.25 12.92 101.00 78.85%
736 | 184693 requests in 10.00m, 2.08GB read
737 | Non-2xx or 3xx responses: 2
738 | Requests/sec: 307.77
739 | Transfer/sec: 3.56MB
740 | ```
741 |
742 | ## Ubuntu (Azure)
743 |
744 | **Swift**
745 |
746 | ```bash
747 | wrk -d 10m -t 4 -c 20 https://taskerswift.azurewebsites.net/tasks -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJEMTE4NkI0NS04OTVDLTQ5QjAtQkFGOS1DQzMxRUUzM0E5RkMiLCJpYXQiOjE1MjM2OTM0MDcuMjYxNjgsInJvbGVzIjpbXSwibmFtZSI6Im1hcnRpbi5kb2VAZW1haWwuY29tIiwiaXNzIjoidGFza2VyLXNlcnZlci1pc3N1ZXIiLCJleHAiOjE1MjM3Mjk0MDcuMjYxNjl9.Em_hlFmpna4XWUnIG5WObyI3phzoGOyIIQmlIeuKbE4"
748 | ```
749 |
750 |
751 | ```
752 | Running 10m test @ https://taskerswift.azurewebsites.net/tasks
753 | 4 threads and 20 connections
754 | Thread Stats Avg Stdev Max +/- Stdev
755 | Latency 88.01ms 20.68ms 900.83ms 83.36%
756 | Req/Sec 55.87 10.90 131.00 72.91%
757 | 134024 requests in 10.00m, 1.44GB read
758 | Socket errors: connect 0, read 0, write 0, timeout 11
759 | Non-2xx or 3xx responses: 11
760 | Requests/sec: 223.34
761 | Transfer/sec: 2.46MB
762 | ```
763 |
764 | **ASP.NET Core**
765 |
766 | ```bash
767 | wrk -d 10m -t 4 -c 20 https://taskercore.azurewebsites.net/tasks -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiMmM4YmUwNi03ZjRhLTQxOTctYjk1Ny1lODgyYTkwMjc2YWIiLCJuYW1lIjoibWFydGluLmRvZUBlbWFpbC5jb20iLCJpc3MiOiJodHRwOi8vdGFza2VyLyIsImlhdCI6IjE1MjM2ODc1NjAiLCJleHAiOiIxNTIzNjg4NzYwIiwiYXVkIjoiaHR0cDovL3Rhc2tlci8ifQ.snA5bi1V9A9VWe5SXLZCSC1vTA3RLG8_MMP42I5A73M"
768 | ```
769 |
770 | ```
771 | Running 10m test @ https://taskercore.azurewebsites.net/tasks
772 | 4 threads and 20 connections
773 | Thread Stats Avg Stdev Max +/- Stdev
774 | Latency 48.06ms 21.06ms 1.04s 90.92%
775 | Req/Sec 105.66 19.89 171.00 72.99%
776 | 252634 requests in 10.00m, 2.85GB read
777 | Non-2xx or 3xx responses: 7
778 | Requests/sec: 421.02
779 | Transfer/sec: 4.86MB
780 | ```
781 |
782 | ### Chart
783 |
784 | 
785 |
786 | ```json
787 | {
788 | "type": "serial",
789 | "categoryField": "category",
790 | "theme": "dark",
791 | "categoryAxis": {},
792 | "trendLines": [],
793 | "graphs": [
794 | {
795 | "balloonText": "[[title]] of [[category]]:[[value]]",
796 | "fillAlphas": 1,
797 | "id": "AmGraph-1",
798 | "title": "Swift",
799 | "type": "column",
800 | "valueField": "Swift"
801 | },
802 | {
803 | "balloonText": "[[title]] of [[category]]:[[value]]",
804 | "fillAlphas": 1,
805 | "id": "AmGraph-2",
806 | "title": "ASP.NET Core",
807 | "type": "column",
808 | "valueField": "ASP.NET Core"
809 | }
810 | ],
811 | "guides": [],
812 | "valueAxes": [
813 | {
814 | "id": "ValueAxis-1",
815 | "minimum": 0,
816 | "title": "Requests (10 minutes)"
817 | }
818 | ],
819 | "allLabels": [],
820 | "balloon": {},
821 | "legend": {
822 | "enabled": true,
823 | "useGraphSettings": true
824 | },
825 | "titles": [
826 | {
827 | "id": "Title-1",
828 | "size": 15,
829 | "text": "Benchmark #6"
830 | }
831 | ],
832 | "dataProvider": [
833 | {
834 | "category": "MacBook Pro",
835 | "Swift": "134385",
836 | "ASP.NET Core": "184693"
837 | },
838 | {
839 | "category": "Ubuntu (Azure)",
840 | "Swift": "134024",
841 | "ASP.NET Core": "252634"
842 | }
843 | ]
844 | }
845 | ```
846 |
847 | # Swift performance (JSON encoding)
848 |
849 | ## Endpoint 1 (Static JSON)
850 |
851 | ```
852 | Running 10m test @ https://taskerperf.azurewebsites.net/endp1
853 | 4 threads and 20 connections
854 | Thread Stats Avg Stdev Max +/- Stdev
855 | Latency 33.99ms 12.59ms 826.84ms 82.98%
856 | Req/Sec 149.09 31.07 240.00 72.59%
857 | 356555 requests in 10.00m, 4.00GB read
858 | Requests/sec: 594.18
859 | Transfer/sec: 6.83MB
860 | ```
861 |
862 | ## Endpoint 2 (Swift JSONEncoder)
863 |
864 | ```
865 | Running 10m test @ https://taskerperf.azurewebsites.net/endp3
866 | 4 threads and 20 connections
867 | Thread Stats Avg Stdev Max +/- Stdev
868 | Latency 535.71ms 81.57ms 1.29s 87.41%
869 | Req/Sec 10.88 5.65 40.00 56.66%
870 | 22397 requests in 10.00m, 244.24MB read
871 | Requests/sec: 37.32
872 | Transfer/sec: 416.80KB
873 | ```
874 |
875 | ## Endpoint 3 (Swift JSONEncoder - static list)
876 |
877 | ```
878 | Running 10m test @ https://taskerperf.azurewebsites.net/endp3
879 | 4 threads and 20 connections
880 | Thread Stats Avg Stdev Max +/- Stdev
881 | Latency 512.36ms 71.76ms 1.38s 85.94%
882 | Req/Sec 10.87 5.22 40.00 64.91%
883 | 23418 requests in 10.00m, 255.45MB read
884 | Requests/sec: 39.02
885 | Transfer/sec: 435.89KB
886 | ```
887 |
888 | ## Endpoint 4 (Perfect JsonEncodedString)
889 |
890 | ```
891 | Running 10m test @ https://taskerperf.azurewebsites.net/endp4
892 | 4 threads and 20 connections
893 | Thread Stats Avg Stdev Max +/- Stdev
894 | Latency 1.11s 104.49ms 1.98s 74.96%
895 | Req/Sec 6.09 4.17 20.00 94.34%
896 | 10770 requests in 10.00m, 147.35MB read
897 | Socket errors: connect 0, read 0, write 0, timeout 3
898 | Requests/sec: 17.95
899 | Transfer/sec: 251.44KB
900 | ```
901 |
902 | ## Endpoint 5 (Perfect JsonEncodedString - static list)
903 |
904 | ```
905 | Running 10m test @ https://taskerperf.azurewebsites.net/endp5
906 | 4 threads and 20 connections
907 | Thread Stats Avg Stdev Max +/- Stdev
908 | Latency 1.03s 100.46ms 1.93s 74.96%
909 | Req/Sec 6.55 4.10 20.00 82.45%
910 | 11620 requests in 10.00m, 158.98MB read
911 | Requests/sec: 19.37
912 | Transfer/sec: 271.31KB
913 | ```
914 |
915 | ## Chart
916 |
917 | 
918 |
919 | ```json
920 | {
921 | "type": "serial",
922 | "categoryField": "category",
923 | "startDuration": 1,
924 | "theme": "dark",
925 | "categoryAxis": {
926 | "gridPosition": "start"
927 | },
928 | "trendLines": [],
929 | "graphs": [
930 | {
931 | "balloonText": "[[title]] of [[category]]:[[value]]",
932 | "fillAlphas": 1,
933 | "id": "AmGraph-1",
934 | "title": "graph 1",
935 | "type": "column",
936 | "valueField": "column-1"
937 | },
938 | {
939 | "balloonText": "[[title]] of [[category]]:[[value]]",
940 | "fillAlphas": 1,
941 | "id": "AmGraph-2",
942 | "title": "graph 2",
943 | "type": "column",
944 | "valueField": "column-2"
945 | }
946 | ],
947 | "guides": [],
948 | "valueAxes": [
949 | {
950 | "id": "ValueAxis-1",
951 | "stackType": "regular",
952 | "title": "Axis title"
953 | }
954 | ],
955 | "allLabels": [],
956 | "balloon": {},
957 | "legend": {
958 | "enabled": false,
959 | "useGraphSettings": true
960 | },
961 | "titles": [
962 | {
963 | "id": "Title-1",
964 | "size": 15,
965 | "text": "Performance"
966 | }
967 | ],
968 | "dataProvider": [
969 | {
970 | "category": "Static JSON",
971 | "column-1": "356555"
972 | },
973 | {
974 | "category": "JSONEncoder",
975 | "column-1": "22397"
976 | },
977 | {
978 | "category": "JSONEncoder - static list",
979 | "column-1": "23418"
980 | },
981 | {
982 | "category": "JsonEncodedString",
983 | "column-1": "10770"
984 | },
985 | {
986 | "category": "JsonEncodedString - static list",
987 | "column-1": "11620"
988 | }
989 | ]
990 | }
991 | ```
--------------------------------------------------------------------------------
/Performance/benchmark-001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-001.png
--------------------------------------------------------------------------------
/Performance/benchmark-002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-002.png
--------------------------------------------------------------------------------
/Performance/benchmark-003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-003.png
--------------------------------------------------------------------------------
/Performance/benchmark-004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-004.png
--------------------------------------------------------------------------------
/Performance/benchmark-005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-005.png
--------------------------------------------------------------------------------
/Performance/benchmark-006.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-006.png
--------------------------------------------------------------------------------
/Performance/benchmark-007.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/benchmark-007.png
--------------------------------------------------------------------------------
/Performance/infrastructure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/infrastructure.png
--------------------------------------------------------------------------------
/Performance/infrastructure.pxm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mczachurski/SwiftBenchmarkJSON/9192438efeb0c327ee67bbbd1f7ae0479eb5c074/Performance/infrastructure.pxm
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Swift JSON Benchmarks
2 |
3 | Benchmark results for different Swift frameworks which work on JSON (encoding/decoding). For reference there is also a benchmark of .NET Core framework (Newtonsoft.JSON), however it's not included in ranks.
4 |
5 | All benchmark was performed on my computer:
6 |
7 | - Device: MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)
8 | - Processor: 2 GHz Intel Core i5
9 | - Memory: 16 GB 1867 MHz LPDDR3
10 | - Graphics: Intel Iris Graphics 540 1536 MB
11 |
12 | Swift version:
13 |
14 | ```bash
15 | Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
16 | Target: x86_64-apple-darwin18.5.0
17 | ```
18 |
19 | Here you can find other benchmark: [https://github.com/bwhiteley/JSONShootout](https://github.com/bwhiteley/JSONShootout)
20 |
21 | ## Build & Run benchmarks
22 |
23 | **Prerequisites**
24 |
25 | Before you start to run benchmarks on your device you have to install:
26 |
27 | - [Swift](https://swift.org/getting-started/#installing-swift)
28 | - [.NET Core](https://www.microsoft.com/net/learn/get-started/macos)
29 |
30 | When you want to change Swift Protobuf model you need to have additional applications:
31 |
32 | - [Google Protobuf compiler](https://github.com/google/protobuf)
33 | - [Swift Protobuf code generator](https://github.com/apple/swift-protobuf/)
34 |
35 | **Build & Run**
36 |
37 | To build and run you have to execute following commands:
38 |
39 | ```bash
40 | $ git clone https://github.com/mczachurski/SwiftBenchmarkJSON.git
41 | $ cd SwiftBenchmarkJSON
42 | $ ./build.sh
43 | $ ./run.sh
44 | ```
45 |
46 | ## List of frameworks
47 |
48 | Below there are links to all benchmarked frameworks.
49 |
50 | - [HandyJSON](https://github.com/alibaba/HandyJSON)
51 | - [Marshall](https://github.com/utahiosmac/Marshal)
52 | - [ObjectMapper](https://github.com/Hearst-DD/ObjectMapper)
53 | - [PMJSON](https://github.com/postmates/PMJSON)
54 | - [SwiftProtobuf](https://github.com/apple/swift-protobuf.git)
55 | - Codable - is built in Swift encoding & decoding based on Codable protocol
56 | - NetCore - is .NET Core implementation of JSON decoding/encoding (Newtonsoft.JSON framework)
57 |
58 | ## Encoding (serialization)
59 |
60 | Benchmarks of algorithms which transform **object(s)** to the corresponding **JSON string**. Object has structure like on following snippet.
61 |
62 | ```swift
63 | TaskClassDto(
64 | id: UUID().uuidString,
65 | createDate: Date(),
66 | name: "Task 1",
67 | isFinished: false,
68 | subtasks: 212,
69 | weight: 3.14,
70 | children: ["taska", "taskb", "taskc"],
71 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
72 | Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis.
73 | Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus
74 | ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae
75 | euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum.
76 | Suspendisse dignissim sapien et consequat lobortis.",
77 | deadline: Date(),
78 | tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
79 | )
80 | ```
81 |
82 | ### Benchmark #1 - Encoding single object
83 |
84 | In this benchmark we are encoding 10,000 times single object.
85 |
86 | **Code**
87 |
88 | Simple implementation with Swift Codable protocol looks like below.
89 |
90 | ```swift
91 | let entity = TaskDto(...)
92 |
93 | let encoder = JSONEncoder()
94 | let formatter = DateFormatter()
95 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
96 | encoder.dateEncodingStrategy = .formatted(formatter)
97 |
98 | do {
99 | for _ in 1...10_000 {
100 | let jsonData = try encoder.encode(entity)
101 | _ = String(data: jsonData, encoding: .utf8)
102 | }
103 | } catch {
104 | print("Error during serialization object to JSON string: \(error)")
105 | }
106 | ```
107 |
108 | **Results**
109 |
110 | | Framework | Run #1 (sec) | Run #2 (sec) | Run #3 (sec) | **Average (sec)** | Ranking |
111 | |---------------|--------------|--------------|--------------|-------------------|---------------------|
112 | | HandyJSON | 3.967 | 3.825 | 3.863 | **3.885** | 6 |
113 | | Marshall | 0.484 | 0.486 | 0.476 | **0.482** | 3 :3rd_place_medal: |
114 | | ObjectMapper | 1.162 | 1.138 | 1.048 | **1.116** | 5 |
115 | | PMJSON | 0.472 | 0.469 | 0.459 | **0.467** | 2 :2nd_place_medal: |
116 | | Codable | 0.708 | 0.705 | 0.702 | **0.705** | 4 |
117 | | SwiftProtobuf | 0.368 | 0.369 | 0.376 | **0.371** | 1 :1st_place_medal: |
118 | | NetCore | 0.093 | 0.089 | 0.087 | **0.090** | - |
119 |
120 |
121 | ### Benchmark #2 - Encoding list of objects
122 |
123 | In this benchmark we are encoding 10,000 times list of 100 objects.
124 |
125 | **Code**
126 |
127 | Implementation with Swift Codable protocol looks like on below snippet.
128 |
129 | ```swift
130 | let list = getListOfTasks() // Returns array of 100 tasks
131 | let encoder = JSONEncoder()
132 |
133 | let formatter = DateFormatter()
134 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
135 | encoder.dateEncodingStrategy = .formatted(formatter)
136 |
137 | do {
138 | for _ in 1...10_000 {
139 | let jsonData = try encoder.encode(list)
140 | _ = String(data: jsonData, encoding: .utf8)
141 | }
142 | } catch {
143 | print("Error during serialization object to JSON string: \(error)")
144 | }
145 | ```
146 |
147 | **Results**
148 |
149 | | Framework | Run #1 (sec) | Run #2 (sec) | Run #3 (sec) | **Average (sec)** | Ranking |
150 | |---------------|--------------|--------------|--------------|-------------------|---------------------|
151 | | HandyJSON | 336.561 | 336.749 | 336.645 | **336.651** | 6 |
152 | | Marshall | 32.776 | 32.136 | 32.346 | **32.419** | 1 :1st_place_medal: |
153 | | ObjectMapper | 84.854 | 76.278 | 79.348 | **80.160** | 5 |
154 | | PMJSON | 77.371 | 53.337 | 63.437 | **64.715** | 4 |
155 | | Codable | 51.383 | 49.456 | 50.355 | **50.398** | 3 :3rd_place_medal: |
156 | | SwiftProtobuf | 36.455 | 36.139 | 36.236 | **36.277** | 2 :2nd_place_medal: |
157 | | NetCore | 8.264 | 8.158 | 8.248 | **8.223** | - |
158 |
159 | ## Decoding (deserialization)
160 |
161 | Benchmarks of algorithms which transform JSON to the corresponding object(s). JSON which is parsed looks like on below snippet.
162 |
163 | ```json
164 | {
165 | "id": "e24e39c2-7b96-4a16-8cb6-bb96239171e5",
166 | "createDate": "2009-02-15T00:00:00Z",
167 | "name": "Task 1",
168 | "isFinished": false,
169 | "subtasks": 212,
170 | "weight": 3.14,
171 | "children": ["taska", "taskb", "taskc"],
172 | "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
173 | Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis.
174 | Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus
175 | ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae
176 | euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum.
177 | Suspendisse dignissim sapien et consequat lobortis.",
178 | "deadline": "2019-02-15T01:10:00Z",
179 | "tags": ["tag1", "tag2", "tag3", "tag4", "tag5"]
180 | }
181 | ```
182 |
183 | ### Benchmark #3 - Decoding single object
184 |
185 | In this benchmark we are decoding 10,000 times JSON string which represent single object.
186 |
187 | **Code**
188 |
189 | Simple implementation with Swift Codable protocol.
190 |
191 | ```swift
192 | let jsonData = getJsonData() // Returns Data object (with single JSON object)
193 | let decoder = JSONDecoder()
194 | let formatter = DateFormatter()
195 |
196 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
197 | decoder.dateDecodingStrategy = .formatted(formatter)
198 |
199 | do {
200 | for _ in 1...10_000 {
201 | let entityJsonData = jsonData.data(using: .utf8)!
202 | _ = try decoder.decode(TaskClassDto.self, from: entityJsonData)
203 | }
204 | } catch {
205 | print("Error during deserialization object from JSON string: \(error)")
206 | }
207 | ```
208 |
209 | **Results**
210 |
211 | | Framework | Run #1 (sec) | Run #2 (sec) | Run #3 (sec) | **Average (sec)** | Ranking |
212 | |---------------|--------------|--------------|--------------|-------------------|---------------------|
213 | | HandyJSON | 3.787 | 3.392 | 3.472 | **3.550** | 6 |
214 | | Marshall | 1.361 | 1.386 | 1.376 | **1.374** | 2 :2nd_place_medal: |
215 | | ObjectMapper | 1.794 | 1.653 | 1.726 | **1.724** | 3 :3rd_place_medal: |
216 | | PMJSON | 3.804 | 2.020 | 2.721 | **2.848** | 5 |
217 | | Codable | 1.939 | 1.955 | 1.941 | **1.945** | 4 |
218 | | SwiftProtobuf | 0.204 | 0.194 | 0.198 | **0.199** | 1 :1st_place_medal: |
219 | | NetCore | 0.188 | 0.179 | 0.182 | **0.183** | - |
220 |
221 | ### Benchmark #4 - Decoding list of objects
222 |
223 | In this benchmark we are decoding 10,000 times JSON string which represent 100 objects.
224 |
225 | **Code**
226 |
227 | Simple implementation with Swift Codable protocol.
228 |
229 | ```swift
230 | let listJson = getJsonListData() // Returns Data object (with list of JSON objects)
231 | let decoder = JSONDecoder()
232 | let formatter = DateFormatter()
233 | formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
234 | decoder.dateDecodingStrategy = .formatted(formatter)
235 |
236 | do {
237 | for _ in 1...10_000 {
238 | let listJsonData = listJson.data(using: .utf8)!
239 | _ = try decoder.decode([TaskClassDto].self, from: listJsonData)
240 | }
241 | } catch {
242 | print("Error during deserialization object from JSON: \(error)")
243 | }
244 | ```
245 |
246 | **Results**
247 |
248 | | Framework | Run #1 (sec) | Run #2 (sec) | Run #3 (sec) | **Average (sec)** | Ranking |
249 | |---------------|--------------|--------------|--------------|-------------------|---------------------|
250 | | HandyJSON | 323.744 | 315.371 | 317.336 | **318.817** | 3 :3rd_place_medal: |
251 | | Marshall | 128.328 | 117.112 | 119.214 | **121.551** | 5 |
252 | | ObjectMapper | 139.405 | 135.547 | 133.544 | **136.165** | 2 :2nd_place_medal: |
253 | | PMJSON | 385.072 | 187.985 | 221.486 | **794,543** | 4 |
254 | | Codable | 170.782 | 171.822 | 171.321 | **171,308** | 6 |
255 | | SwiftProtobuf | 14.572 | 14.370 | 14.471 | **14,471** | 1 :1st_place_medal: |
256 | | NetCore | 8.368 | 8.283 | 8.189 | **2.367** | - |
257 |
258 | ## Bonus (Binary SwiftProtobuf)
259 |
260 | *SwiftProtobuf* provides additionally binary decoding (instead of JSON string). That kind of encoding/decoding
261 | is very fast. Below there is table with result for each of above test.
262 |
263 | | Test | Run #1 (sec) | Run #2 (sec) | Run #3 (sec) | **Average (sec)** |
264 | |-----------------------------|--------------|--------------|--------------|-------------------|
265 | | Encoding (single object) | 0.0459 | 0.0374 | 0.0398 | **0,041** |
266 | | Encoding (list of objects) | 3.458 | 3.480 | 3.472 | **3,470** |
267 | | Dencoding (single object) | 0.0725 | 0.0615 | 0.0707 | **0,068** |
268 | | Dencoding (list of objects) | 5.681 | 5.683 | 5.683 | **5,682** |
269 |
270 | It's fastest decoding/encoding. Unfortunately client have to support that kind of data. However, if
271 | your API have to be very fast you should take into account that kind of encoding/decoding.
272 |
273 | ## Contributing
274 |
275 | If you would like to add another framework for comparison, submit a pull request. Add folder with new benchmark implementation (we have separate application for each framework). Add new framework to `build.sh` and `run.sh` scripts.
--------------------------------------------------------------------------------
/SwiftProtobuf/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:4.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Benchmark",
8 | dependencies: [
9 | .package(url: "https://github.com/apple/swift-protobuf.git", from: "1.4.0")
10 | ],
11 | targets: [
12 | .target(name: "Benchmark", dependencies: ["SwiftProtobuf"]),
13 | ]
14 | )
15 |
--------------------------------------------------------------------------------
/SwiftProtobuf/Sources/Benchmark/DataModel.pb.swift:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT.
2 | //
3 | // Generated by the Swift generator plugin for the protocol buffer compiler.
4 | // Source: DataModel.proto
5 | //
6 | // For information on using the generated types, please see the documenation:
7 | // https://github.com/apple/swift-protobuf/
8 |
9 | import Foundation
10 | import SwiftProtobuf
11 |
12 | // If the compiler emits an error on this type, it is because this file
13 | // was generated by a version of the `protoc` Swift plug-in that is
14 | // incompatible with the version of SwiftProtobuf to which you are linking.
15 | // Please ensure that your are building against the same version of the API
16 | // that was used to generate this file.
17 | fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck {
18 | struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {}
19 | typealias Version = _2
20 | }
21 |
22 | struct Tasks {
23 | // SwiftProtobuf.Message conformance is added in an extension below. See the
24 | // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
25 | // methods supported on all messages.
26 |
27 | var tasks: [Task] = []
28 |
29 | var unknownFields = SwiftProtobuf.UnknownStorage()
30 |
31 | init() {}
32 | }
33 |
34 | struct Task {
35 | // SwiftProtobuf.Message conformance is added in an extension below. See the
36 | // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
37 | // methods supported on all messages.
38 |
39 | var id: String {
40 | get {return _storage._id}
41 | set {_uniqueStorage()._id = newValue}
42 | }
43 |
44 | var name: String {
45 | get {return _storage._name}
46 | set {_uniqueStorage()._name = newValue}
47 | }
48 |
49 | var createDate: SwiftProtobuf.Google_Protobuf_Timestamp {
50 | get {return _storage._createDate ?? SwiftProtobuf.Google_Protobuf_Timestamp()}
51 | set {_uniqueStorage()._createDate = newValue}
52 | }
53 | /// Returns true if `createDate` has been explicitly set.
54 | var hasCreateDate: Bool {return _storage._createDate != nil}
55 | /// Clears the value of `createDate`. Subsequent reads from it will return its default value.
56 | mutating func clearCreateDate() {_uniqueStorage()._createDate = nil}
57 |
58 | var isFinished: Bool {
59 | get {return _storage._isFinished}
60 | set {_uniqueStorage()._isFinished = newValue}
61 | }
62 |
63 | var subtasks: Int32 {
64 | get {return _storage._subtasks}
65 | set {_uniqueStorage()._subtasks = newValue}
66 | }
67 |
68 | var weight: Double {
69 | get {return _storage._weight}
70 | set {_uniqueStorage()._weight = newValue}
71 | }
72 |
73 | var children: [String] {
74 | get {return _storage._children}
75 | set {_uniqueStorage()._children = newValue}
76 | }
77 |
78 | var description_p: String {
79 | get {return _storage._description_p}
80 | set {_uniqueStorage()._description_p = newValue}
81 | }
82 |
83 | var deadline: SwiftProtobuf.Google_Protobuf_Timestamp {
84 | get {return _storage._deadline ?? SwiftProtobuf.Google_Protobuf_Timestamp()}
85 | set {_uniqueStorage()._deadline = newValue}
86 | }
87 | /// Returns true if `deadline` has been explicitly set.
88 | var hasDeadline: Bool {return _storage._deadline != nil}
89 | /// Clears the value of `deadline`. Subsequent reads from it will return its default value.
90 | mutating func clearDeadline() {_uniqueStorage()._deadline = nil}
91 |
92 | var tags: [String] {
93 | get {return _storage._tags}
94 | set {_uniqueStorage()._tags = newValue}
95 | }
96 |
97 | var unknownFields = SwiftProtobuf.UnknownStorage()
98 |
99 | init() {}
100 |
101 | fileprivate var _storage = _StorageClass.defaultInstance
102 | }
103 |
104 | // MARK: - Code below here is support for the SwiftProtobuf runtime.
105 |
106 | extension Tasks: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
107 | static let protoMessageName: String = "Tasks"
108 | static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
109 | 1: .same(proto: "tasks"),
110 | ]
111 |
112 | mutating func decodeMessage(decoder: inout D) throws {
113 | while let fieldNumber = try decoder.nextFieldNumber() {
114 | switch fieldNumber {
115 | case 1: try decoder.decodeRepeatedMessageField(value: &self.tasks)
116 | default: break
117 | }
118 | }
119 | }
120 |
121 | func traverse(visitor: inout V) throws {
122 | if !self.tasks.isEmpty {
123 | try visitor.visitRepeatedMessageField(value: self.tasks, fieldNumber: 1)
124 | }
125 | try unknownFields.traverse(visitor: &visitor)
126 | }
127 |
128 | static func ==(lhs: Tasks, rhs: Tasks) -> Bool {
129 | if lhs.tasks != rhs.tasks {return false}
130 | if lhs.unknownFields != rhs.unknownFields {return false}
131 | return true
132 | }
133 | }
134 |
135 | extension Task: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
136 | static let protoMessageName: String = "Task"
137 | static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
138 | 1: .same(proto: "id"),
139 | 2: .same(proto: "name"),
140 | 3: .same(proto: "createDate"),
141 | 4: .same(proto: "isFinished"),
142 | 5: .same(proto: "subtasks"),
143 | 6: .same(proto: "weight"),
144 | 7: .same(proto: "children"),
145 | 8: .same(proto: "description"),
146 | 9: .same(proto: "deadline"),
147 | 10: .same(proto: "tags"),
148 | ]
149 |
150 | fileprivate class _StorageClass {
151 | var _id: String = String()
152 | var _name: String = String()
153 | var _createDate: SwiftProtobuf.Google_Protobuf_Timestamp? = nil
154 | var _isFinished: Bool = false
155 | var _subtasks: Int32 = 0
156 | var _weight: Double = 0
157 | var _children: [String] = []
158 | var _description_p: String = String()
159 | var _deadline: SwiftProtobuf.Google_Protobuf_Timestamp? = nil
160 | var _tags: [String] = []
161 |
162 | static let defaultInstance = _StorageClass()
163 |
164 | private init() {}
165 |
166 | init(copying source: _StorageClass) {
167 | _id = source._id
168 | _name = source._name
169 | _createDate = source._createDate
170 | _isFinished = source._isFinished
171 | _subtasks = source._subtasks
172 | _weight = source._weight
173 | _children = source._children
174 | _description_p = source._description_p
175 | _deadline = source._deadline
176 | _tags = source._tags
177 | }
178 | }
179 |
180 | fileprivate mutating func _uniqueStorage() -> _StorageClass {
181 | if !isKnownUniquelyReferenced(&_storage) {
182 | _storage = _StorageClass(copying: _storage)
183 | }
184 | return _storage
185 | }
186 |
187 | mutating func decodeMessage(decoder: inout D) throws {
188 | _ = _uniqueStorage()
189 | try withExtendedLifetime(_storage) { (_storage: _StorageClass) in
190 | while let fieldNumber = try decoder.nextFieldNumber() {
191 | switch fieldNumber {
192 | case 1: try decoder.decodeSingularStringField(value: &_storage._id)
193 | case 2: try decoder.decodeSingularStringField(value: &_storage._name)
194 | case 3: try decoder.decodeSingularMessageField(value: &_storage._createDate)
195 | case 4: try decoder.decodeSingularBoolField(value: &_storage._isFinished)
196 | case 5: try decoder.decodeSingularInt32Field(value: &_storage._subtasks)
197 | case 6: try decoder.decodeSingularDoubleField(value: &_storage._weight)
198 | case 7: try decoder.decodeRepeatedStringField(value: &_storage._children)
199 | case 8: try decoder.decodeSingularStringField(value: &_storage._description_p)
200 | case 9: try decoder.decodeSingularMessageField(value: &_storage._deadline)
201 | case 10: try decoder.decodeRepeatedStringField(value: &_storage._tags)
202 | default: break
203 | }
204 | }
205 | }
206 | }
207 |
208 | func traverse(visitor: inout V) throws {
209 | try withExtendedLifetime(_storage) { (_storage: _StorageClass) in
210 | if !_storage._id.isEmpty {
211 | try visitor.visitSingularStringField(value: _storage._id, fieldNumber: 1)
212 | }
213 | if !_storage._name.isEmpty {
214 | try visitor.visitSingularStringField(value: _storage._name, fieldNumber: 2)
215 | }
216 | if let v = _storage._createDate {
217 | try visitor.visitSingularMessageField(value: v, fieldNumber: 3)
218 | }
219 | if _storage._isFinished != false {
220 | try visitor.visitSingularBoolField(value: _storage._isFinished, fieldNumber: 4)
221 | }
222 | if _storage._subtasks != 0 {
223 | try visitor.visitSingularInt32Field(value: _storage._subtasks, fieldNumber: 5)
224 | }
225 | if _storage._weight != 0 {
226 | try visitor.visitSingularDoubleField(value: _storage._weight, fieldNumber: 6)
227 | }
228 | if !_storage._children.isEmpty {
229 | try visitor.visitRepeatedStringField(value: _storage._children, fieldNumber: 7)
230 | }
231 | if !_storage._description_p.isEmpty {
232 | try visitor.visitSingularStringField(value: _storage._description_p, fieldNumber: 8)
233 | }
234 | if let v = _storage._deadline {
235 | try visitor.visitSingularMessageField(value: v, fieldNumber: 9)
236 | }
237 | if !_storage._tags.isEmpty {
238 | try visitor.visitRepeatedStringField(value: _storage._tags, fieldNumber: 10)
239 | }
240 | }
241 | try unknownFields.traverse(visitor: &visitor)
242 | }
243 |
244 | static func ==(lhs: Task, rhs: Task) -> Bool {
245 | if lhs._storage !== rhs._storage {
246 | let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in
247 | let _storage = _args.0
248 | let rhs_storage = _args.1
249 | if _storage._id != rhs_storage._id {return false}
250 | if _storage._name != rhs_storage._name {return false}
251 | if _storage._createDate != rhs_storage._createDate {return false}
252 | if _storage._isFinished != rhs_storage._isFinished {return false}
253 | if _storage._subtasks != rhs_storage._subtasks {return false}
254 | if _storage._weight != rhs_storage._weight {return false}
255 | if _storage._children != rhs_storage._children {return false}
256 | if _storage._description_p != rhs_storage._description_p {return false}
257 | if _storage._deadline != rhs_storage._deadline {return false}
258 | if _storage._tags != rhs_storage._tags {return false}
259 | return true
260 | }
261 | if !storagesAreEqual {return false}
262 | }
263 | if lhs.unknownFields != rhs.unknownFields {return false}
264 | return true
265 | }
266 | }
267 |
--------------------------------------------------------------------------------
/SwiftProtobuf/Sources/Benchmark/DataModel.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | import "google/protobuf/timestamp.proto";
3 |
4 | message Tasks {
5 | repeated Task tasks = 1;
6 | }
7 |
8 | message Task {
9 | string id = 1;
10 | string name = 2;
11 | google.protobuf.Timestamp createDate = 3;
12 | bool isFinished = 4;
13 | int32 subtasks = 5;
14 | double weight = 6;
15 | repeated string children = 7;
16 | string description = 8;
17 | google.protobuf.Timestamp deadline = 9;
18 | repeated string tags = 10;
19 | }
20 |
--------------------------------------------------------------------------------
/SwiftProtobuf/Sources/Benchmark/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import SwiftProtobuf
3 |
4 | func evaluateProblem(_ name: String, method: () -> Void) {
5 |
6 | let start = DispatchTime.now()
7 | method()
8 | let end = DispatchTime.now()
9 |
10 | let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
11 | let timeInterval = Double(nanoTime) / 1_000_000_000
12 |
13 | print(" \(name): \(timeInterval) seconds")
14 | }
15 |
16 | func getList() -> Tasks {
17 | var tasks = Tasks()
18 |
19 | for i in 1...100 {
20 |
21 | var task = Task()
22 | task.id = UUID().uuidString
23 | task.createDate = SwiftProtobuf.Google_Protobuf_Timestamp(date: Date())
24 | task.name = "Task \(i)"
25 | task.isFinished = false
26 | task.subtasks = 212
27 | task.weight = 3.14
28 | task.children = ["taska", "taskb", "taskc"]
29 | task.description_p = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis."
30 | task.deadline = SwiftProtobuf.Google_Protobuf_Timestamp(date: Date())
31 | task.tags = ["tag1", "tag2", "tag3", "tag4", "tag5"]
32 |
33 | tasks.tasks.append(task)
34 | }
35 |
36 | return tasks
37 | }
38 |
39 | func getObject() -> Task {
40 |
41 | var task = Task()
42 | task.id = UUID().uuidString
43 | task.createDate = SwiftProtobuf.Google_Protobuf_Timestamp(date: Date())
44 | task.name = "Task 1"
45 | task.isFinished = false
46 | task.subtasks = 212
47 | task.weight = 3.14
48 | task.children = ["taska", "taskb", "taskc"]
49 | task.description_p = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget sem erat. Quisque dictum tellus in feugiat facilisis. Vivamus porttitor vel arcu id cursus. Cras interdum massa ac rhoncus ornare. Sed quis massa felis. Curabitur blandit tempor enim, vitae euismod nibh tincidunt a. Duis faucibus dapibus purus nec dictum. Suspendisse dignissim sapien et consequat lobortis."
50 | task.deadline = SwiftProtobuf.Google_Protobuf_Timestamp(date: Date())
51 | task.tags = ["tag1", "tag2", "tag3", "tag4", "tag5"]
52 |
53 | return task
54 | }
55 |
56 | var object = getObject()
57 | var list = getList()
58 |
59 | var objectJson = try! object.jsonString()
60 | var listJson = try! list.jsonString()
61 |
62 | var objectData = try! object.serializedData()
63 | var listData = try! list.serializedData()
64 |
65 | print("Running benchmarks for SwiftProtobuf:")
66 |
67 | // Encoding single object 10,000 times.
68 | evaluateProblem("#1 (JSON) Encoding (single object)") {
69 | do {
70 | for _ in 1...10_000 {
71 | _ = try object.jsonString()
72 | }
73 | } catch {
74 | print("Error during serialization object to JSON: \(error)")
75 | }
76 | }
77 |
78 | // Encoding single object 10,000 times.
79 | evaluateProblem("#1 (Binary) Encoding (single object)") {
80 | do {
81 | for _ in 1...10_000 {
82 | _ = try object.serializedData()
83 | }
84 | } catch {
85 | print("Error during serialization object to JSON: \(error)")
86 | }
87 | }
88 |
89 | // Encoding list of objects 10,000 times (JSON).
90 | evaluateProblem("#2 (JSON) Encoding (list of objects)") {
91 | do {
92 | for _ in 1...10_000 {
93 | _ = try list.jsonString()
94 | }
95 | } catch {
96 | print("Error during serialization object to JSON: \(error)")
97 | }
98 | }
99 |
100 | // Encoding list of objects 10,000 times (binary).
101 | evaluateProblem("#2 (Binary) Encoding (list of objects)") {
102 | do {
103 | for _ in 1...10_000 {
104 | _ = try list.serializedData()
105 | }
106 | } catch {
107 | print("Error during serialization object to JSON: \(error)")
108 | }
109 | }
110 |
111 | // Decoding single object 10,000 times.
112 | evaluateProblem("#3 (JSON) Decoding (single object)") {
113 | do {
114 | for _ in 1...10_000 {
115 | _ = try Task(jsonString: objectJson)
116 | }
117 | } catch {
118 | print("Error during deserialization object from JSON: \(error)")
119 | }
120 | }
121 |
122 | // Decoding single object 10,000 times.
123 | evaluateProblem("#3 (Binary) Decoding (single object)") {
124 | do {
125 | for _ in 1...10_000 {
126 | _ = try Task(serializedData: objectData)
127 | }
128 | } catch {
129 | print("Error during deserialization object from JSON: \(error)")
130 | }
131 | }
132 |
133 | // Decoding list of objects 10,000 times (JSON).
134 | evaluateProblem("#4 (JSON) Decoding (list of objects)") {
135 | do {
136 | for _ in 1...10_000 {
137 | _ = try Tasks(jsonString: listJson)
138 | }
139 | } catch {
140 | print("Error during deserialization object from JSON: \(error)")
141 | }
142 | }
143 |
144 | // Decoding list of objects 10,000 times (binary).
145 | evaluateProblem("#4 (Binary) Decoding (list of objects)") {
146 | do {
147 | for _ in 1...10_000 {
148 | _ = try Tasks(serializedData: listData)
149 | }
150 | } catch {
151 | print("Error during deserialization object from JSON: \(error)")
152 | }
153 | }
154 |
--------------------------------------------------------------------------------
/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cd HandyJSON
4 | swift package update
5 | swift build --configuration release -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
6 |
7 | cd ../Marshall
8 | swift package update
9 | swift build --configuration release -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
10 |
11 | cd ../ObjectMapper
12 | swift package update
13 | swift build --configuration release -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
14 |
15 | cd ../PMJSON
16 | swift package update
17 | swift build --configuration release -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
18 |
19 | cd ../Codable
20 | swift package update
21 | swift build --configuration release -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
22 |
23 | cd ../SwiftProtobuf
24 | swift package update
25 | swift build --configuration release -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
26 |
27 | cd ../NetCore
28 | dotnet build --configuration=release
--------------------------------------------------------------------------------
/list-chart.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "serial",
3 | "categoryField": "category",
4 | "startDuration": 1,
5 | "theme": "default",
6 | "categoryAxis": {
7 | "gridPosition": "start"
8 | },
9 | "trendLines": [],
10 | "graphs": [
11 | {
12 | "balloonText": "[[title]] of [[category]]:[[value]]",
13 | "fillAlphas": 1,
14 | "id": "AmGraph-1",
15 | "title": "Encoding list",
16 | "type": "column",
17 | "valueField": "column-1"
18 | },
19 | {
20 | "balloonText": "[[title]] of [[category]]:[[value]]",
21 | "fillAlphas": 1,
22 | "id": "AmGraph-3",
23 | "title": "Decoding list",
24 | "type": "column",
25 | "valueField": "column-3"
26 | }
27 | ],
28 | "guides": [],
29 | "valueAxes": [
30 | {
31 | "id": "ValueAxis-1",
32 | "stackType": "regular",
33 | "title": "Time (sec)"
34 | }
35 | ],
36 | "allLabels": [],
37 | "balloon": {},
38 | "legend": {
39 | "enabled": true,
40 | "useGraphSettings": true
41 | },
42 | "titles": [
43 | {
44 | "id": "Title-1",
45 | "size": 15,
46 | "text": "Decoding & Encoding list of objects (10,000 times)"
47 | }
48 | ],
49 | "dataProvider": [
50 | {
51 | "category": "HandyJSON",
52 | "column-1": "100.175",
53 | "column-3": "22.619"
54 | },
55 | {
56 | "category": "Marshall",
57 | "column-1": "4.646",
58 | "column-3": "50.320"
59 | },
60 | {
61 | "category": "ObjectMapper",
62 | "column-1": "15.689",
63 | "column-3": "14.325"
64 | },
65 | {
66 | "category": "PMJSON",
67 | "column-1": "4.73",
68 | "column-3": "39.588"
69 | },
70 | {
71 | "category": "Codable",
72 | "column-1": "19.43",
73 | "column-3": "74.652"
74 | },
75 | {
76 | "category": "SwiftProtobuf",
77 | "column-1": "4.200",
78 | "column-3": "2.373"
79 | },
80 | {
81 | "category": "NetCore",
82 | "column-1": "1.787",
83 | "column-3": "2.367"
84 | }
85 | ]
86 | }
--------------------------------------------------------------------------------
/object-chart.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "serial",
3 | "categoryField": "category",
4 | "startDuration": 1,
5 | "theme": "default",
6 | "categoryAxis": {
7 | "gridPosition": "start"
8 | },
9 | "trendLines": [],
10 | "graphs": [
11 | {
12 | "balloonText": "[[title]] of [[category]]:[[value]]",
13 | "fillAlphas": 1,
14 | "id": "AmGraph-1",
15 | "title": "Encoding single object",
16 | "type": "column",
17 | "valueField": "column-1"
18 | },
19 | {
20 | "balloonText": "[[title]] of [[category]]:[[value]]",
21 | "fillAlphas": 1,
22 | "id": "AmGraph-3",
23 | "title": "Decoding single object",
24 | "type": "column",
25 | "valueField": "column-3"
26 | }
27 | ],
28 | "guides": [],
29 | "valueAxes": [
30 | {
31 | "id": "ValueAxis-1",
32 | "stackType": "regular",
33 | "title": "Time (sec)"
34 | }
35 | ],
36 | "allLabels": [],
37 | "balloon": {},
38 | "legend": {
39 | "enabled": true,
40 | "useGraphSettings": true
41 | },
42 | "titles": [
43 | {
44 | "id": "Title-1",
45 | "size": 15,
46 | "text": "Decoding & Encoding single object (10,000 times)"
47 | }
48 | ],
49 | "dataProvider": [
50 | {
51 | "category": "HandyJSON",
52 | "column-1": "0.760",
53 | "column-3": "0.306"
54 | },
55 | {
56 | "category": "Marshall",
57 | "column-1": "0.099",
58 | "column-3": "0.563"
59 | },
60 | {
61 | "category": "ObjectMapper",
62 | "column-1": "0.259",
63 | "column-3": "0.218"
64 | },
65 | {
66 | "category": "PMJSON",
67 | "column-1": "0.051",
68 | "column-3": "0.434"
69 | },
70 | {
71 | "category": "Codable",
72 | "column-1": "0.303",
73 | "column-3": "0.788"
74 | },
75 | {
76 | "category": "SwiftProtobuf",
77 | "column-1": "0.043",
78 | "column-3": "0.048"
79 | },
80 | {
81 | "category": "NetCore",
82 | "column-1": "0.027",
83 | "column-3": "0.101"
84 | }
85 | ]
86 | }
--------------------------------------------------------------------------------
/run.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | ./HandyJSON/.build/x86_64-apple-macosx10.10/release/Benchmark
4 | ./Marshall/.build/x86_64-apple-macosx10.10/release/Benchmark
5 | ./ObjectMapper/.build/x86_64-apple-macosx10.10/release/Benchmark
6 | ./PMJSON/.build/x86_64-apple-macosx10.10/release/Benchmark
7 | ./Codable/.build/x86_64-apple-macosx10.10/release/Benchmark
8 | ./SwiftProtobuf/.build/x86_64-apple-macosx10.10/release/Benchmark
9 | dotnet ./NetCore/bin/release/netcoreapp2.0/NetCore.dll
10 |
--------------------------------------------------------------------------------