菜鸟教程小白 发表于 2022-12-13 11:04:08

ios - Objective-c 中的静态变量和性能


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

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

<pre><code>dataArray = [ dataArray]
    objectAtIndex:CURRENTLY_SELECTED_DATA_INDEX;
</code></pre>

<p>然后</p>

<pre><code>myTitleString = ;
</code></pre>

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

<pre><code>myTitleString = [[[ dataArray]
    objectAtIndex:CURRENTLY_SELECTED_INDEX] objectAtIndex:keyTitleStringIndexKey];
</code></pre>

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

<pre><code>2012-01-29 18:31:57.539 XXXXXXX static average: 0.058798
2012-01-29 18:31:57.543 XXXXXXX nonstatic average: 0.058395
</code></pre>

<p>如您所见,静态初始化实际上比非静态初始化<em>慢</em>,但仅相差几万分之一秒。这可能只是测量不准确的产物,但结果足以让我相信差异小到可以忽略。谜团解开了。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当您执行上述操作时,您实际上并没有创建一个新数组,只是获取了一个指向该数组的指针。您不是在复制实际数据。 </p>

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

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

<hr/>

<p>编辑:</p>

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

<pre><code>NSMutableArray *data1 = [ init];
NSMutableArray *data2 = [ init];
NSArray *all = [ initWithObjects:data1,data2,nil];
for(int i=0;i&lt;1000;i++)
{
    initWithInt:arc4random()]];
    initWithInt:arc4random()]];
}
double startTime = CACurrentMediaTime();
for(int i=0;i&lt;1000;i++)
{
    NSArray *get1 = ;
    NSArray *get2 = ;
    //int get1Index = arc4random() % ;
    //int get2Index = arc4random() % ;

    //NSLog(@&#34;Object at %d: %f&#34;, get1Index, [ doubleValue]);
    //NSLog(@&#34;Object at %d: %f&#34;, get2Index, [ doubleValue]);
    NSLog(@&#34;Object at %d: %f&#34;, i, [ doubleValue]);
    NSLog(@&#34;Object at %d: %f&#34;, i, [ doubleValue]);
}
NSLog(@&#34;Time with temp array:%f&#34;, CACurrentMediaTime() - startTime);

startTime = CACurrentMediaTime();
for(int i=0;i&lt;1000;i++)
{
    //int get1Index = arc4random() % [ count];
    //int get2Index = arc4random() % [ count];

    //NSLog(@&#34;Object at %d: %f&#34;, get1Index, [[ objectAtIndex:get1Index] doubleValue]);
    //NSLog(@&#34;Object at %d: %f&#34;, get2Index, [[ objectAtIndex:get2Index] doubleValue]);
    NSLog(@&#34;Object at %d: %f&#34;, i, [[ objectAtIndex:i] doubleValue]);
    NSLog(@&#34;Object at %d: %f&#34;, i, [[ objectAtIndex:i] doubleValue]);
}
NSLog(@&#34;Time without temp array:%f&#34;, CACurrentMediaTime() - startTime);
//With random access
//2012-01-28 13:44:12.721 test Time with temp array:0.924193
//2012-01-28 13:44:13.641 test Time without temp array:0.919250
//2012-01-28 13:44:44.892 test Time with temp array:0.926337
//2012-01-28 13:44:45.812 test Time without temp array:0.920447
//With incremental access
//2012-01-28 13:46:43.948 test Time with temp array:0.935009
//2012-01-28 13:46:44.927 test Time without temp array:0.978455
//2012-01-28 13:47:40.317 test Time with temp array:1.173752
//2012-01-28 13:47:41.307 test Time without temp array:0.989263
</code></pre>

<p>注释掉的部分是我用于测试随机访问的部分,对于增量访问,我使用了当前代码。没有临时数组会快一点,但并不明显。不足以牺牲可读性。我想这只是将它写到一个减慢它的变量的过程,但同时,拥有一个未嵌入的临时数组要快得多。如果您多次使用嵌入式数组,则必须执行 2 次内存访问而不是 1 次。因此,如果您要多次使用嵌入式数组,我想增益将显着弥补使用临时数组的损失。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Objective-c 中的静态变量和性能,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9046475/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9046475/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Objective-c 中的静态变量和性能