在開發中數組可以說是最常用到的數據結構了,無論是存儲對象還是獲取沙盒目錄數組中文件路徑,會經常用到數組的兩個對象方法: 即 [xx數組 firstObject] 和 [xx數組 lastObject]. 譬如獲取沙盒中cache文件夾路徑
或
[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]因為 NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) 所取到的路徑數組只有一個,所以兩者皆可獲取沙盒中cache路徑. 每每使用我都會好奇兩個方法哪個性能高一點? 使用iOS測試用例實地測試一下便可.
首先自定義一個工具類 TestTool 聲明如下方法
+(NSNumber *)firstNum;+(NSNumber *)lastNum;-(NSNumber *)firstNumber;-(NSNumber *)lastNumber;并實現
+(NSNumber *)firstNum{ return [testNumbers firstObject];}+(NSNumber *)lastNum{ return [testNumbers lastObject];}-(NSNumber *)firstNumber{ return [testNumbers firstObject];}-(NSNumber *)lastNumber{ return [testNumbers lastObject];}宏定義初始化數組 testNumbers0
#define testNumbers @[@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123,@98,@7,@97987,@3456,@0,@87,@456,@66,@12,@90,@9,@678,@4567,@987654,@10010,@6545,@798,@123]下面使用測試用例分別使用   [testNumbers firstObject] 和 [testNumbers lastObject] 提取數組中第一個或最后一個元素 123  .為使結果更明顯,同樣使用for循環提取900000遍,查看耗時.
[xx數組 firstObject] : 一個存儲多組數據的數組取首元素五次測試值平均耗時 3.4964 秒
/// 類方法測試 lastObject-(void)testPerformanceArrLast_ClassMethod{ [self measureBlock:^{ for (int i = 0; i < 900000; i++) { NSNumber *lastNum = [TestTool lastNum]; } }]; // 多數據數組 - 五次結果分別:3.342 3.282 3.357 3.318 3.359 平均:3.3316}[xx數組 lastObject]: 一個存儲多組數據的數組取首元素五次測試值平均耗時 3.3316 秒
[xx數組 lastObject] 性能要優于 [xx數組 firstObject]數組更改為:
#define testNumbers @[@123]將上述測試數組更換為只有一個數據的單數據數組, 這樣無論[testNumbers0 lastObject] 性還是 [xx數組 firstObject] 取得都是同一個數據,測試兩個類方法性能差異
[xx數組 firstObject] : 一個存儲單一數據的數組取首元素五次測試值平均耗時 0.2016 秒
/// 類方法測試 lastObject-(void)testPerformanceArrLast_ClassMethod{ [self measureBlock:^{ for (int i = 0; i < 900000; i++) { NSNumber *lastNum = [TestTool lastNum]; } }]; // 單數據數組 - 五次結果分別:0.197 0.195 0.206 0.194 0.197 平均:0.1978}[xx數組 lastObject]: 一個存儲單一數據的數組取首元素五次測試值平均耗時 0.1978 秒
[xx數組 lastObject] 性能同樣也要優于 [xx數組 firstObject]眾所周知聲明一個類,在類中聲明方法可以聲明類方法和對象方法, 倘若方法中不會使用類中成員變量和屬性,一般建議將方法聲明為類方法,因為相同的算法類方法性能要優于對象方法.下面對上述結論進行測試,畢竟耳聽為虛.
下面在類方法和對象方法中同樣執行 對相同數組(1數據數組) 進行相同 [xx數組 lastObject] 算法 即對比如下兩方法
測試用例進行測試
/// 類方法測試 lastObject-(void)testPerformanceArrLast_ClassMethod{ [self measureBlock:^{ for (int i = 0; i < 900000; i++) { NSNumber *lastNum = [TestTool lastNum]; } }]; // 單數據數組 - 五次結果分別:0.197 0.195 0.206 0.194 0.197 平均:0.1978}/// 對象方法測試 lastObject-(void)testPerformanceArrLast_ObjectMethod{ [self measureBlock:^{ for (int i = 0; i < 900000; i++) { TestTool *tool = [[TestTool alloc] init]; NSNumber *lastNum = [tool lastNumber]; } }]; // 單數據數組 - 五次結果分別: 0.333 0.333 0.349 0.350 0.331 平均:0.3392}新聞熱點
疑難解答