diff --git a/CollectionKit.xcodeproj/project.pbxproj b/CollectionKit.xcodeproj/project.pbxproj index 8b0026a..6667d72 100644 --- a/CollectionKit.xcodeproj/project.pbxproj +++ b/CollectionKit.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ A363C56A20C955C7009A885F /* LayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A363C56920C955C7009A885F /* LayoutContext.swift */; }; A363C56C20CACA8A009A885F /* FlattenedProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A363C56B20CACA89009A885F /* FlattenedProvider.swift */; }; A363C56E20CBD55B009A885F /* ComposedHeaderProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A363C56D20CBD55B009A885F /* ComposedHeaderProvider.swift */; }; + A376B2E921B5A00E00A027BD /* SingleSectionPerformanceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A376B2E821B5A00E00A027BD /* SingleSectionPerformanceTest.swift */; }; + A376B2EB21B5A43900A027BD /* ComposedSectionPerformanceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A376B2EA21B5A43900A027BD /* ComposedSectionPerformanceTest.swift */; }; A39C84932177B028002084AD /* WaterfallLayoutSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = A39C84922177B028002084AD /* WaterfallLayoutSpec.swift */; }; A39C84952177B347002084AD /* BasicProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = A39C84942177B347002084AD /* BasicProviderSpec.swift */; }; A39C849D2177BF9B002084AD /* SimpleViewSizeSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = A39C849B2177BF8B002084AD /* SimpleViewSizeSource.swift */; }; @@ -97,6 +99,8 @@ A363C56920C955C7009A885F /* LayoutContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutContext.swift; sourceTree = ""; }; A363C56B20CACA89009A885F /* FlattenedProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlattenedProvider.swift; sourceTree = ""; }; A363C56D20CBD55B009A885F /* ComposedHeaderProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposedHeaderProvider.swift; sourceTree = ""; }; + A376B2E821B5A00E00A027BD /* SingleSectionPerformanceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleSectionPerformanceTest.swift; sourceTree = ""; }; + A376B2EA21B5A43900A027BD /* ComposedSectionPerformanceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposedSectionPerformanceTest.swift; sourceTree = ""; }; A39C84922177B028002084AD /* WaterfallLayoutSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaterfallLayoutSpec.swift; sourceTree = ""; }; A39C84942177B347002084AD /* BasicProviderSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicProviderSpec.swift; sourceTree = ""; }; A39C84972177BF49002084AD /* UIImageSizeSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageSizeSource.swift; sourceTree = ""; }; @@ -363,6 +367,8 @@ B145FF9F1F5BB4D700A4F318 /* ComposedProviderSpec.swift */, A39C84A12177E223002084AD /* ComposedHeaderProviderSpec.swift */, A3328EB5218B96A000A28AE8 /* EmptyStateProviderSpec.swift */, + A376B2E821B5A00E00A027BD /* SingleSectionPerformanceTest.swift */, + A376B2EA21B5A43900A027BD /* ComposedSectionPerformanceTest.swift */, ); path = CollectionKitTests; sourceTree = SOURCE_ROOT; @@ -542,7 +548,9 @@ B19D64D01F23DE8100D02FDB /* RowLayoutSpec.swift in Sources */, B145FFA01F5BB4D700A4F318 /* ComposedProviderSpec.swift in Sources */, 0E3258451F5E23B000D455F8 /* FlowLayoutSpec.swift in Sources */, + A376B2EB21B5A43900A027BD /* ComposedSectionPerformanceTest.swift in Sources */, A39C84932177B028002084AD /* WaterfallLayoutSpec.swift in Sources */, + A376B2E921B5A00E00A027BD /* SingleSectionPerformanceTest.swift in Sources */, A39C84952177B347002084AD /* BasicProviderSpec.swift in Sources */, B1A8E2DD1F59E99500172387 /* CollectionViewSpec.swift in Sources */, A3328EB6218B96A000A28AE8 /* EmptyStateProviderSpec.swift in Sources */, diff --git a/CollectionKit.xcodeproj/xcshareddata/xcbaselines/B12F9B201E804C370085F37D.xcbaseline/5BE1D297-F4EF-4D65-9F0C-B607EC8797C3.plist b/CollectionKit.xcodeproj/xcshareddata/xcbaselines/B12F9B201E804C370085F37D.xcbaseline/5BE1D297-F4EF-4D65-9F0C-B607EC8797C3.plist new file mode 100644 index 0000000..dcb5aab --- /dev/null +++ b/CollectionKit.xcodeproj/xcshareddata/xcbaselines/B12F9B201E804C370085F37D.xcbaseline/5BE1D297-F4EF-4D65-9F0C-B607EC8797C3.plist @@ -0,0 +1,75 @@ + + + + + classNames + + ComposedSectionPerformanceTest + + testReloadPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.26296 + baselineIntegrationDisplayName + Local Baseline + + + testScrollPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.42 + baselineIntegrationDisplayName + Local Baseline + + + testVisibleIndexesPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.0033543 + baselineIntegrationDisplayName + Local Baseline + + + + SingleSectionPerformanceTest + + testReloadPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.19627 + baselineIntegrationDisplayName + Local Baseline + + + testScrollPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.14618 + baselineIntegrationDisplayName + Local Baseline + + + testVisibleIndexesPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.0016359 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/CollectionKit.xcodeproj/xcshareddata/xcbaselines/B12F9B201E804C370085F37D.xcbaseline/Info.plist b/CollectionKit.xcodeproj/xcshareddata/xcbaselines/B12F9B201E804C370085F37D.xcbaseline/Info.plist new file mode 100644 index 0000000..a73e871 --- /dev/null +++ b/CollectionKit.xcodeproj/xcshareddata/xcbaselines/B12F9B201E804C370085F37D.xcbaseline/Info.plist @@ -0,0 +1,40 @@ + + + + + runDestinationsByUUID + + 5BE1D297-F4EF-4D65-9F0C-B607EC8797C3 + + localComputer + + busSpeedInMHz + 400 + cpuCount + 1 + cpuKind + Intel Core i9 + cpuSpeedInMHz + 2900 + logicalCPUCoresPerPackage + 12 + modelCode + MacBookPro15,1 + physicalCPUCoresPerPackage + 6 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone10,4 + platformIdentifier + com.apple.platform.iphonesimulator + + + + + diff --git a/CollectionKitTests/ComposedSectionPerformanceTest.swift b/CollectionKitTests/ComposedSectionPerformanceTest.swift new file mode 100644 index 0000000..5d1223c --- /dev/null +++ b/CollectionKitTests/ComposedSectionPerformanceTest.swift @@ -0,0 +1,62 @@ +// +// ComposedSectionPerformanceTest.swift +// CollectionKitTests +// +// Created by Luke Zhao on 2018-12-03. +// Copyright © 2018 lkzhao. All rights reserved. +// + +@testable import CollectionKit +import XCTest + +class ComposedSectionPerformanceTest: XCTestCase { + var collectionView: CollectionView! + + override func setUp() { + collectionView = CollectionView(frame: CGRect(x: 0, y: 0, width: 100, height: 1000)) + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + + let sections: [ComposedProvider] = (0..<10).map { _ in + let sections: [Provider] = (0..<100).map { _ in + let viewSource = ClosureViewSource(viewUpdater: { _, _, _ in }) + viewSource.reuseManager.removeFromCollectionViewWhenReuse = true + return BasicProvider(dataSource: Array(0..<100), viewSource: viewSource, + sizeSource: { _, _, _ in return CGSize(width: 100, height: 100) }) + } + return ComposedProvider(sections: sections) + } + let provider = ComposedProvider(layout: RowLayout().transposed(), sections: sections) + collectionView.provider = provider + collectionView.reloadData() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testReloadPerformance() { + measure { + collectionView.reloadData() + } + } + + func testVisibleIndexesPerformance() { + measure { + for _ in 0..<1000 { + collectionView.bounds.origin.y += 100 + _ = collectionView.provider!.visibleIndexes(visibleFrame: collectionView.bounds) + } + } + } + + func testScrollPerformance() { + measure { + for _ in 0..<1000 { + collectionView.bounds.origin.y += 100 + collectionView.layoutSubviews() + } + } + } + +} diff --git a/CollectionKitTests/SingleSectionPerformanceTest.swift b/CollectionKitTests/SingleSectionPerformanceTest.swift new file mode 100644 index 0000000..920c705 --- /dev/null +++ b/CollectionKitTests/SingleSectionPerformanceTest.swift @@ -0,0 +1,58 @@ +// +// PerformanceTest.swift +// CollectionKitTests +// +// Created by Luke Zhao on 2018-12-03. +// Copyright © 2018 lkzhao. All rights reserved. +// + +@testable import CollectionKit +import XCTest + +class SingleSectionPerformanceTest: XCTestCase { + var collectionView: CollectionView! + + override func setUp() { + collectionView = CollectionView(frame: CGRect(x: 0, y: 0, width: 100, height: 1000)) + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + let dataSource = ArrayDataSource(data: Array(0..<100000)) + let provider = BasicProvider( + dataSource: dataSource, + viewSource: { (label: UILabel, data: Int, index: Int) in }, + sizeSource: { (index: Int, data: Int, collectionSize: CGSize) -> CGSize in + return CGSize(width: 50, height: 50) + }) + collectionView.provider = provider + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testReloadPerformance() { + measure { + collectionView.reloadData() + } + } + + func testVisibleIndexesPerformance() { + measure { + for _ in 0..<1000 { + collectionView.bounds.origin.y += 100 + _ = collectionView.provider!.visibleIndexes(visibleFrame: collectionView.bounds) + } + } + } + + func testScrollPerformance() { + collectionView.reloadData() + measure { + for _ in 0..<1000 { + collectionView.bounds.origin.y += 10 + collectionView.layoutSubviews() + } + } + } + +}