2012-01-28 69 views
2

在一个具有许多不同UITableView的应用程序中,我发现自己经常使用临时数组导入用于填充表视图的数据,确定行数,节数,页眉,页脚数,等等。我想知道是否因为这些数组需要为表格中的每个单元格反复创建,因此如果声明静态,所以不需要再次创建它们将有助于性能,因为现在正在创建这些数组在cellForRowAtIndexPath:,numberOfRowsInSections:,numberOfSectionsInTableView:, footerForSection:`。会宣布这么多的静态数组(可能包含大量的信息,比如说几千条数据和几百个字符串),从长远来看,帮助还是伤害了我?我知道一个静态数组在应用程序生命的过程中留在内存中,那么这么多静态数组是否是有害的呢?假设这个过程在应用程序的整个过程中发生在4-5个视图控制器中,我们正在讨论这个数组的15-20个副本。这里我最好的选择是什么?谢谢静态变量和性能Objective-c

编辑:我正在使用保存值的​​单身人士。临时数组的真正原因是保持代码清洁。我可以这样做

dataArray = [[SingletonDataController sharedSingleton] dataArray] 
    objectAtIndex:CURRENTLY_SELECTED_DATA_INDEX; 

然后

myTitleString = [dataArray objectAtIndex:keyTitleStringIndexKey]; 

,而不是分组所有到一个不可读的语句,如:

myTitleString = [[[[SingletonDataController sharedSingleton] dataArray] 
    objectAtIndex:CURRENTLY_SELECTED_INDEX] objectAtIndex:keyTitleStringIndexKey]; 

我已经完成我自己的一些测试,比较的时间它需要在静态初始化的情况下创建表视图。这些结果如下:

2012-01-29 18:31:57.539 XXXXXXX[711:707] static average: 0.058798 
2012-01-29 18:31:57.543 XXXXXXX[711:707] nonstatic average: 0.058395 

正如你所看到的,静态初始化实际上是比非静止的要慢,但只有一秒钟的几万分之一。这可能只是测量结果不准确的结果,但结果足以说服我说,这种差异足够小而无法解决。谜团已揭开。

+0

而不是保持大量的副本可以保持包含数组或其他东西的缓存副本的单身?我不清楚为什么你一次又一次地创建它。它是从您的数据模型计算出来的值,而不仅仅是存储在那里的值? – user1118321 2012-01-28 15:56:31

+0

更新的答案与解释 – 2012-01-28 16:10:14

回答

3

当你这样做时,你实际上并没有创建一个新的数组,只是获取一个指向该数组的指针。您没有复制实际数据。

通过保持代码清洁,您只会失去为指针创建内存并为其指定值的性能。所以不,你没有失去表现。

保持代码清洁的想法比这个和那里的额外指针的边际差异要重要得多。


编辑:

,我做了两年不如预期,这两个选项执行非常相似的之间的一些测试。

NSMutableArray *data1 = [[NSMutableArray alloc] init]; 
NSMutableArray *data2 = [[NSMutableArray alloc] init]; 
NSArray *all = [[NSArray alloc] initWithObjects:data1,data2,nil]; 
for(int i=0;i<1000;i++) 
{ 
    [data1 addObject:[[NSNumber alloc] initWithInt:arc4random()]]; 
    [data2 addObject:[[NSNumber alloc] initWithInt:arc4random()]]; 
} 
double startTime = CACurrentMediaTime(); 
for(int i=0;i<1000;i++) 
{ 
    NSArray *get1 = [all objectAtIndex:0]; 
    NSArray *get2 = [all objectAtIndex:1]; 
    //int get1Index = arc4random() % [get1 count]; 
    //int get2Index = arc4random() % [get2 count]; 

    //NSLog(@"Object at %d: %f", get1Index, [[get1 objectAtIndex:get1Index] doubleValue]); 
    //NSLog(@"Object at %d: %f", get2Index, [[get2 objectAtIndex:get2Index] doubleValue]); 
    NSLog(@"Object at %d: %f", i, [[get1 objectAtIndex:i] doubleValue]); 
    NSLog(@"Object at %d: %f", i, [[get2 objectAtIndex:i] doubleValue]); 
} 
NSLog(@"Time with temp array:%f", CACurrentMediaTime() - startTime); 

startTime = CACurrentMediaTime(); 
for(int i=0;i<1000;i++) 
{ 
    //int get1Index = arc4random() % [[all objectAtIndex:0] count]; 
    //int get2Index = arc4random() % [[all objectAtIndex:1] count]; 

    //NSLog(@"Object at %d: %f", get1Index, [[[all objectAtIndex:0] objectAtIndex:get1Index] doubleValue]); 
    //NSLog(@"Object at %d: %f", get2Index, [[[all objectAtIndex:1] objectAtIndex:get2Index] doubleValue]); 
    NSLog(@"Object at %d: %f", i, [[[all objectAtIndex:0] objectAtIndex:i] doubleValue]); 
    NSLog(@"Object at %d: %f", i, [[[all objectAtIndex:1] objectAtIndex:i] doubleValue]); 
} 
NSLog(@"Time without temp array:%f", CACurrentMediaTime() - startTime); 
//With random access 
//2012-01-28 13:44:12.721 test[23164:f803] Time with temp array:0.924193 
//2012-01-28 13:44:13.641 test[23164:f803] Time without temp array:0.919250 
//2012-01-28 13:44:44.892 test[23191:f803] Time with temp array:0.926337 
//2012-01-28 13:44:45.812 test[23191:f803] Time without temp array:0.920447 
//With incremental access 
//2012-01-28 13:46:43.948 test[23231:f803] Time with temp array:0.935009 
//2012-01-28 13:46:44.927 test[23231:f803] Time without temp array:0.978455 
//2012-01-28 13:47:40.317 test[23254:f803] Time with temp array:1.173752 
//2012-01-28 13:47:41.307 test[23254:f803] Time without temp array:0.989263 

注释掉部分是我用来测试的随机访问,我目前使用的代码增量访问的章节。没有临时数组是一个更快的分数,但并不明显。不足以牺牲可读性。我想这只是将它写入一个变慢的过程,但同时,有一个未嵌入的临时数组要快得多。如果您多次使用嵌入式阵列,则必须执行2次内存访问,而不是1次。因此,如果您要多次使用嵌入式阵列,我认为增益会显着弥补使用临时阵列的损失。

+0

感谢您的深入解答。我想我会对自己做一些测试,但看起来性能好处几乎不明显,可读性可能更重要。我会发布我自己的测试结果。 – 2012-01-28 21:01:58

+0

我已经发布了我自己的测试结果。感谢您的帮助! – 2012-01-29 23:32:27