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

Performance 哪个更快?比较还是分配?,performance,optimization,refactoring,Performance,Optimization,Refactoring,我正在做一点编码,我必须写这样的代码: if( array[i]==false ) array[i]=true; 我想知道它是否应该重新写为 array[i]=true; 这就提出了一个问题:比较比作业快吗 不同语言之间的差异如何?(java和cpp之间的对比,例如) 注意:我听说“过早优化是万恶之源”。我认为这在这里并不适用:)好吧,既然你说你确信这很重要,那么你应该编写一个测试程序并测量以找出差异 如果对分配在内存中分散地址的多个变量执行此代码,则比较速度会更快。通过比较,您将只

我正在做一点编码,我必须写这样的代码:

if( array[i]==false )
    array[i]=true;
我想知道它是否应该重新写为

array[i]=true;
这就提出了一个问题:比较比作业快吗

不同语言之间的差异如何?(java和cpp之间的对比,例如)


注意:我听说“过早优化是万恶之源”。我认为这在这里并不适用:)

好吧,既然你说你确信这很重要,那么你应该编写一个测试程序并测量以找出差异

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

这不仅仅是,这是,这是一种无关的分心


假设你的数组是布尔型的,那么你的比较就没有必要了,这是唯一相关的观察结果。

我真的不希望像这样琐碎的东西会有任何明显的性能差异,所以可以肯定的是,归根结底,是什么让你的代码更清晰易读。我的观点总是正确的。

不妨尝试一下:

if(!array[i])
    array[i]=true;

但真正确定的唯一方法是分析,我相信几乎所有编译器都会认为与false的比较是不必要的,并对其进行优化。

这一切都取决于数据类型。分配布尔值比首先比较布尔值要快。但对于更大的基于值的数据类型,情况可能并非如此。

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

最好的情况只比直接分配好,但最坏的情况比普通分配差得多。就现实世界的数据而言,任务可能是最快的

输出:

  • 0.0119960308075秒内分配
  • 最坏情况比较时间为0.0188510417938秒
  • 最佳案例比较时间为0.0116770267487秒
代码:


正如其他人所指出的,这是微观优化

(在政治或新闻业中,这被称为看肚脐;-)

程序是否足够大,可以有两层以上的函数/方法/子例程调用

如果是这样的话,它可能会接到一些可以避免的电话,而这些电话可能会浪费上百次的时间,就像低水平的低效率一样


假设你有(很少有人有),那么一定要在秒表下运行10^9次,看看哪个更快。

如果你只想翻转数值,那么请执行以下操作:

array[i] = !array[i];
但是,使用这种方法的性能实际上更差,因为它不必只检查一次真值和假值,而是检查两次


如果您声明一个1000000元素的数组为true、false、true、false,则模式比较会变慢。(var b=!b)本质上是两次检查,而不是一次检查

取决于语言。但是,通过阵列进行循环也可能成本高昂。如果数组位于连续内存中,最快的方法是使用memcpy在整个数组中写入1位(255),前提是您的语言/编译器可以这样做


因此,执行0读1写总计,不读/写循环变量/数组变量(每个循环2读/2写)数百次。

为什么还要写第一个版本?在设置为真之前检查是否有错误有什么好处。如果你总是要把它设为真,那么就要把它设为真


当您遇到性能瓶颈时,可以追溯到不必要地设置单个布尔值,请回来与我们联系。

我相信如果比较和赋值语句都是原子语句(即一条处理器指令),并且循环执行n次,那么在最坏的情况下,比较和赋值需要n+1(在每次迭代中进行比较并设置赋值)执行,而不断地分配布尔值则需要n次执行。因此,第二次执行效率更高。

我记得在一本关于汇编语言的书中,作者声称,如果可能的话,应该避免条件。
如果条件为false,执行必须跳转到另一行,则执行速度会慢得多,这会大大降低性能。此外,由于程序是在机器代码中执行的,我认为“if”在每个(已编译的)代码中都会慢得多语言,除非它的条件几乎总是正确的。

我同意。从可读性的角度来看,它可能会很好,但如果改变是为了“提高”性能,肯定不会。@cletus,如果只是一个调用,那就是微观优化。如果是无数个调用,那就是宏观优化。无论如何,我测试的相关线程都不是他进行了赋值和比较。结果表明,虽然我同意您的逻辑,但比较速度更快。在.Net 4.6.1中进行了测试,除非您正在为一个处理器速度非常慢的嵌入式系统编写程序,否则您不必担心。即使在这一点上,您也不愿意使用optimizeCan阵列[I]不是布尔值吗?如果不是,则重写是正确的。是的,数组是布尔值数组。对所有发表“意见”的人关于什么更快以及为什么更快,请停下来。要知道给定编译器在给定处理器上什么更快,唯一的方法就是对它进行基准测试。在哪里可以测量和测试某些东西,意见并不重要。对于提问者来说,这不需要担心,但是如果你必须,那么测试它超过1000000次迭代,获得几次运行的平均时间,c把它挂起来,看看有什么区别。理论上,一个可能比另一个快,但对于一个原始数据类型,它们实际上是相同的。@Binary Worrier:你怎么知道1000000次迭代是正确的
array[i] = !array[i];