哪个更快?比较还是分配?

jrh*_*ath 35 optimization performance refactoring

我正在做一些编码,我必须编写这种代码:

if( array[i]==false )
    array[i]=true;
Run Code Online (Sandbox Code Playgroud)

我想知道它是否应该重写为

array[i]=true;
Run Code Online (Sandbox Code Playgroud)

这就提出了一个问题:比例分配的速度快吗?

从语言到语言的差异怎么样?(例如java和cpp之间的对比)

注意:我听说"过早优化是所有邪恶的根源." 我不认为这适用于:)

cle*_*tus 27

这不仅仅是过早优化,这是微观优化,这是一种无关紧要的分心.

假设您的数组是布尔类型,那么您的比较是不必要的,这是唯一相关的观察.

  • 我测试了 bool 赋值和比较。结果显示比较速度更快,尽管我同意你的逻辑。在.Net 4.6.1 中测试 (2认同)

sha*_*oth 19

好吧,因为你说你确定这很重要,你应该写一个测试程序和测量来找到差异.

如果在内存中分散的地址分配的多个变量上执行此代码,则比较可以更快.通过比较,您只会将内存中的数据读取到处理器缓存中,如果在缓存决定刷新行时不更改变量值,则会看到该行未更改且无需将其写回记忆.这可以加快执行速度.

  • 缓存不会自动执行此操作吗?即检查写入的数据是否与那里的数据相同。 (2认同)

Oli*_*Oli 15

编辑:我用PHP编写了一个脚本.我只是注意到它有一个明显的错误,这意味着最好的情况运行时计算不正确(可怕没人注意到!)

最好的情况只是击败彻底的任务,但最坏的情况比普通的任务更糟糕.就实际数据而言,分配可能是最快的.

输出:

  • 分配在0.0119960308075秒
  • 最差情况比较0.0188510417938秒
  • 0.0116770267487秒内的最佳案例比较

码:

<?php
$arr = array();

$mtime = explode(" ", microtime());
$starttime = $mtime[1] + $mtime[0];

reset_arr($arr);

for ($i=0;$i<10000;$i++)
    $arr[i] = true;


$mtime = explode(" ", microtime());
$firsttime = $mtime[1] + $mtime[0];
$totaltime = ($firsttime - $starttime);
echo "assignment in ".$totaltime." seconds<br />"; 

reset_arr($arr);

for ($i=0;$i<10000;$i++)
    if ($arr[i])
        $arr[i] = true;

$mtime = explode(" ", microtime());
$secondtime = $mtime[1] + $mtime[0];
$totaltime = ($secondtime - $firsttime);
echo "worst case comparison in ".$totaltime." seconds<br />"; 

reset_arr($arr);

for ($i=0;$i<10000;$i++)
    if (!$arr[i])
        $arr[i] = false;

$mtime = explode(" ", microtime());
$thirdtime = $mtime[1] + $mtime[0];
$totaltime = ($thirdtime - $secondtime);
echo "best case comparison in ".$totaltime." seconds<br />"; 

function reset_arr($arr) {
    for ($i=0;$i<10000;$i++)
        $arr[$i] = false;
}
Run Code Online (Sandbox Code Playgroud)