C# 非常基本的代码性能

C# 非常基本的代码性能,c#,java,c++,C#,Java,C++,可能重复: 有人能解释一下为什么当我们要增加整数值时,++i比i++快吗 我想它可能指的是任何编程语言。绝对不是。这是一种常见的谬论,不知何故一直存在 注意,当“i”是一个对象,并且正在进行赋值时,“i++”将调用该对象的副本(在++之前的值),而“++i”不会。如果不需要对象,现代编译器将不会执行该对象的副本。如果您有一个表达式,如 k=i++ k获取递增之前的i旧值,而i得到递增。此副本会对性能产生影响,预增量不需要此副本。但有时两者不能互换。在本例中,使用 k=++i 您将获得k的另一个

可能重复:

有人能解释一下为什么当我们要增加整数值时,++i比i++快吗
我想它可能指的是任何编程语言。

绝对不是。这是一种常见的谬论,不知何故一直存在


注意,当“i”是一个对象,并且正在进行赋值时,“i++”将调用该对象的副本(在++之前的值),而“++i”不会。如果不需要对象,现代编译器将不会执行该对象的副本。

如果您有一个表达式,如

k=i++

k
获取递增之前的
i
旧值,而i得到递增。此副本会对性能产生影响,预增量不需要此副本。但有时两者不能互换。在本例中,使用

k=++i

您将获得k的另一个值。

让我们做一些(无意义的)基准测试,以表明它是不相关的:

测试代码:(Java)

以及输出:

Postincrement: 16039755
Preincrement: 16069900

大多数时候,情况并非如此。事实上,这在所有情况下都不重要(重要的是,提出这类问题的人无论如何也无法解决问题)。真的,我们已经有过上千次了。使用搜索。我完全同意这是废话,但这是在微软的采访中被问到的问题。为什么这不让我感到惊讶。。。伙计们,不管你是不是喜欢我,但我知道如何用谷歌搜索,这个话题只能证明我认为这个问题没有绝对/最终的答案,这只是我开始这个话题的原因。正如其他人所说,这不是基本类型的真正问题。如果您为自定义类实现自己的运算符,那么这可能会成为一个真正的问题。当我在循环中使用递增时,我在使用++I或I++时,这是否重要,或者它仅在赋值时才相关。对不起,您似乎在说
k=++I
不创建副本?这是完全错误的。
k=i++
k=++i
都执行完全相同的操作,只是顺序不同。还是我误解了你的答案?这个答案我必须-1。问题是关于integer的,而不是关于一些复杂的类型,这些类型需要大量的复制费用。任何可能的post++开销都将非常依赖于实现和体系结构。甚至没有任何理由相信拷贝是生成的,除非它被分配了,而且这里有很大的编译器优化空间。事实上,不能保证++pre不是更贵的。事实上,微软会问一个像这样的预微优化问题,这足以说明问题。我也做了一些测试——部分基于你的测试。在我看来,这进一步证实了两者之间的差异可以左右摇摆,最多的差异仅在几十万(当时)的范围内。我的版本在此处可用:。
Postincrement: 16039755
Preincrement: 16069900