OGeek|极客世界-中国程序员成长平台

标题: ios - Objective-c 中的静态变量和性能 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 11:04
标题: ios - Objective-c 中的静态变量和性能

在具有许多不同 UITableViews 的应用程序中,我发现自己经常使用临时数组来导入用于填充表格 View 的数据,确定行数、节数、页眉、页脚等。我想知道,因为如果声明静态,则需要为表中的每个单元格一遍又一遍地创建这些数组,因此不需要再次创建它们将有助于提高性能,因为现在这些数组是在 cellForRowAtIndexPath:, numberOfRowsInSections:, numberOfSectionsInTableView:,footerForSection:`。从长远来看,声明这么多静态数组(可能包含大量信息,比如几千个 double 和几百个字符串)会帮助还是伤害我?我知道静态数组会在应用程序的整个生命周期中保留在内存中,那么这么多静态数组会有害吗?假设这个过程在整个应用程序的过程中发生在 4-5 个 View Controller 中,我们谈论的是这个数组的 15-20 个副本。我在这里最好的选择是什么?谢谢

编辑:我正在使用一个保存值的单例。临时数组的真正原因是保持代码干净。我可以做类似的事情

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

然后

myTitleString = [dataArray objectAtIndex:keyTitleStringIndexKey]; 

而不是将它们全部归为一个不可读的语句,例如:

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

我自己进行了一些测试,比较了使用/不使用静态初始化创建 TableView 所需的时间。结果如下:

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

如您所见,静态初始化实际上比非静态初始化,但仅相差几万分之一秒。这可能只是测量不准确的产物,但结果足以让我相信差异小到可以忽略。谜团解开了。



Best Answer-推荐答案


当您执行上述操作时,您实际上并没有创建一个新数组,只是获取了一个指向该数组的指针。您不是在复制实际数据。

通过保持代码干净,您只会失去为指针创建内存和为指针分配值的性能。所以不,你不会失去性能。

保持代码干净的想法比这里和那里的额外指针的微小差异更重要。


编辑:

我在两者之间进行了一些测试,正如预期的那样,两个选项的表现非常相似。

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 次。因此,如果您要多次使用嵌入式数组,我想增益将显着弥补使用临时数组的损失。

关于ios - Objective-c 中的静态变量和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046475/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4