├── .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 | ![benchmark-001](benchmark-001.png) 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 | ![benchamrk-002](benchmark-002.png) 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 | ![benchmark-003](benchmark-003.png) 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 | ![benchmark-004](benchmark-004.png) 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 | ![benchmark-005](benchmark-005.png) 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 | ![benchmark-006](benchmark-006.png) 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 | ![benchmark-007](benchmark-007.png) 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 | --------------------------------------------------------------------------------