Skip to main content

Posts

Showing posts from February, 2017

[探索 5 分鐘] i++ 與 ++i 的功能與性能是否相同 ? 用程式範例介紹 (c#)

值相同, 但我們知道這兩個 Foo 操作是不同的 Foo( x++ ); // post-increment Foo( ++x ); // pre-increment 大家比較常用的 i++, x++... 我們稱為 post-increment, 是在這一行程式完成之後, 再進行 +1 的動作, 反之稱之為 pre-increment。所以其實上面例子可以理解為如下 (功能上, 非編譯器行為), 更囉嗦的版本。 // Foo ( x++ ) Foo( x ); x = x + 1; // Foo ( ++x ) x = x + 1; Foo( x ); wiki  的例子更清楚, 請特別注意 y 的值。 int x, y; // Increment operators x = 1; y = ++x; // x is now 2, y is also 2 y = x++; // x is now 3, y is 2 這樣看完應該更無懸念了, post-increment 不是等號左邊跑完進行 ++, 也不是等號右邊跑完進行 ++, 就是這一行整個跑完才進行 ++。 // Copy one array to another void copy_array(float *src, float *dst, int n) { while (n-- > 0) // Loop that counts down from n to zero *dst++ = *src++; // Copies element *(src) to *(dst), // then increments both pointers } 以上是說明功能上的不同; 在場景上, 陣列或指標的操作很適合 post-increment, 有「同一行, 同時完成操作並與結束往下一個位置移動, 的簡潔代碼」設計 。性能呢 ? Foo( ++x ) 跟 Foo ( x++ ) 各跑 1 千萬次, 結果是 Foo( ++x ) 這個 pre-increment 呼叫版本性能穩定領先, 非常微小的領先。 附帶一提, 就單一行性能來比較 ++x 與 x++,  性