|
![]() | |
|
先日Xで、forのインクリメントでi++を使ったときと++iを使ったときで速度差が出るという話を聞いてビックリしたという話が投稿されていました。 ++iはiの値を1加算してその結果を返すのに対し、i++はiの値を1加算しつつ加算前の値を返すという、挙動の違いがあります。 多分この話って、現代では速度差が出ないことの方が多い、という注釈をつける必要がありますね。というのも、現代のC/C++コンパイラは非常に進化していて、最適化機構が非常に優秀なので、forの最後に i++ とだけ書くだけれあれば(変数可算後の結果を受け取らないのであれば)、自動的に++iと同じコードが生成されるようになっています。なので、速度差はでません。 昔の、最適化が優秀でなかった時代のコンパイラだったり、もしかしたらデバッグモードで生成されるものであれば、i++の生成コードは遅く大きいものになっている可能性があります。 で、ここではC++の話を書いてしまったのですが、つい先日構築したFR-Scriptインタプリタだとどうなるのか?といえば、そんな最適化の機構は存在しないので、i++だと遅くなります。 ![]() ▲FR-Scriptインタプリタの++i, i++の実装の違い ++iの方は、i+=xと共通の実装になっています。いずれにせよ、加算した結果をそのまま返すだけの単純な仕組みです。 一方で、i++の方は、加算前の値を保存しておいて、それを返す必要があるため、ひと手間かかります。余計な領域が必要になるし、保存しておく時間もかかる。返ってきた値を使う目的がないのならば、あえて使う必要はありません。 似ているけど実装が違うものと言えば、掛け算と割り算もありますね。 ![]() ▲FR-Scriptインタプリタの掛け算(mul), 割り算(div)の実装の違い 掛け算(mul)の方は、単純に掛けたら終わりです(C/C++と同様にオーバーフローのチェックがない)。対して、割り算(div)の方は、0除算になるかの事前チェックがあるので、その分のチェック処理が存在していて、時間がかかります。これをやらないと、呼び出し元のプログラムを巻き込んでプロセスごと強制終了させられてしまうことになるので、避けなければなりません。 こういうのって、実際に自力での実装をしてみると、原理や事情が分かって面白いです。 目次の表示: ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメール、フィードバックまたはX等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。 当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。 |
- 最近の更新 - |
|
|
3493423 (+0083)[+0778] Copyright© 2010-2026 INASOFT | ||