Swift performance: map() and reduce() vs for loops

后端 未结 3 1406
感情败类
感情败类 2020-12-12 18:14

I\'m writing some performance-critical code in Swift. After implementing all the optimizations I could think of, and profiling the application in Instruments, I came to rea

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-12 18:36

    I did a quick set of performance tests measuring the performance of repeated transformations on an Array of Strings, and it showed that .map was much more performant than a for loop, by a factor of about 10x.

    The results in the screenshot below show that chained transformations in a single map block outperform multiple maps with a single transformation in each, and any use of map out-performs for loops.

    Code I used in a Playground:

    import Foundation
    import XCTest
    
    class MapPerfTests: XCTestCase {
    	var array =
    		[
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString",
    			"MyString"
    	]
    
    	func testForLoopAllInOnePerf() {
    		measure {
    			var newArray: [String] = []
    			for item in array {
    				newArray.append(item.uppercased().lowercased().uppercased().lowercased())
    			}
    		}
    	}
    
    	func testForLoopMultipleStagesPerf() {
    		measure {
    			var newArray: [String] = []
    			for item in array {
    				let t1 = item.uppercased()
    				let t2 = item.lowercased()
    				let t3 = item.uppercased()
    				let t4 = item.lowercased()
    				newArray.append(t4)
    			}
    		}
    	}
    
    	func testMultipleMapPerf() {
    		measure {
    			let newArray = array
    				.map( { $0.uppercased() } )
    				.map( { $0.lowercased() } )
    				.map( { $0.uppercased() } )
    				.map( { $0.lowercased() } )
    		}
    	}
    
    	func testSingleMapPerf() {
    		measure {
    			let newArray = array
    				.map( { $0.uppercased().lowercased().uppercased().lowercased() } )
    		}
    	}
    }
    
    MapPerfTests.defaultTestSuite.run()

提交回复
热议问题