- C++相談室 part144
567 :デフォルトの名無しさん[]:2019/08/20(火) 14:29:19.64 ID:aHZAynoR - よくあるような、
if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') || c == '_' ) { ・・・ } の部分を、条件jmp文が少しでも少なくなるようにと思って、 予め作成しておいたテーブル(配列)を使って、 if ( eiji_or_underscore[c] != 0 ) { ・・・ } として実測してみたところ、何度計測しても後者の方が遅くなった。 アセンブリコードを見てみても、前者だと5つの条件jmp命令、後者だと1つの条件jmp命令と、 後者の方が命令数が少なくっていた。しかし、前者だと、レジスタとcmp命令を使っていたが、 後者だとグローバル変数の配列を読み出しに行っていた。 最近のCPUは非常に複雑で高度な「分岐予測」をしていて、配列は読み出してみないと 値が分からないので、「予測」ができず、分岐予測の「予測間違い」がおきるが、 レジスタをcmpで比較する場合には予測が出来るためだろうか。 しかし、昔より最適化する際にどっちが高速になるかの予想が難しくなってしまってる。
|
- C++相談室 part144
568 :デフォルトの名無しさん[sage]:2019/08/20(火) 14:39:39.94 ID:aHZAynoR - >>567
誤:if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') || 正:if ( (c >= 'A' && c <='Z') || (c >= 'a' && c <='z') ||
|
- C++相談室 part144
573 :デフォルトの名無しさん[sage]:2019/08/20(火) 15:08:33.40 ID:aHZAynoR - 理論上は、メモリがキャッシュに乗っている限り、メモリの読み書きとレジスタ
への読み書きの速度は同一です。 ただし、メモリとメモリは add, sub, mov 命令で2つのオペランドに同時指定は 出来ないのに対し、レジスタは出来るので、確率的にレジスタの方が必要な 命令数が少なくて済むので高速になる場合があります。 あとキャッシュに乗って無い場合はメモリは遅くなります。
|
- C++相談室 part144
578 :デフォルトの名無しさん[sage]:2019/08/20(火) 15:36:01.76 ID:aHZAynoR - >>577
実はその影響もあると思っているのですが、それだけだと前者の場合には、 命令数から言えば1〜2クロックほど速くなる場合がある程度です。 しかし、実測してみると、後者のやり方の方がもっと遅くなっている ようなんです。 面倒ですが、マクロスイッチでコードを切り替えられるようにして 短時間の内に二つを切り替えて速度比較してみようかと思っているところです。
|
- 将来性ないプログラミング言語。Delphi含まれず安心
131 :デフォルトの名無しさん[sage]:2019/08/20(火) 21:47:25.12 ID:aHZAynoR - >>127
文系の人は、lexical(字面)的な読解力が頭の良さだと勘違いしやすいが、 そうではない。字面ではなく本質的なところが重要。字面的な判別能力 を自慢にしてる人は、短いが見にくい変な書き方をして結局本人も間違う。
|
- 将来性ないプログラミング言語。Delphi含まれず安心
132 :デフォルトの名無しさん[sage]:2019/08/20(火) 21:50:09.95 ID:aHZAynoR - >>127
ちなみにおいらは、客観的に見て低脳ドカタではない。 高IQ、高学歴、高実績で評価は高い。
|
- 将来性ないプログラミング言語。Delphi含まれず安心
134 :デフォルトの名無しさん[sage]:2019/08/20(火) 21:58:55.64 ID:aHZAynoR - >>128
C/C++において、関数の引数を二行以上に渡って書きたいような時、 インデントと意味は、有る意味ではずれる。しかし、それぞれの引数の後ろに 一つずつコメントを書きたいようなときにはそのの書き方は見やすい : func( aaa, // これこれこういう意味。 bbb, // TYPE *pXxxx ); また、ターゲット別に #if #endif などでコードを変えたいような場合は、 インデントの関係がどうしても崩れる場合があるし、その場その場で マクロに対するインデントを重視するか、C/C++言語に対するインデントを 重視するか、どちらがいいかは一概には決まらない。 #if xxx TYPE aaa; ・・・ #else ・・・ #endif ↑TYPE aaa; の部分に、#if ブロックのインデントを付けた方がいい場合と、むしろ、その場の C/C++ のブロック宣言としてのインデントの位置を維持した方が分かりやすい場合とが有り、 どちらも優劣付けがたい。
|
- 将来性ないプログラミング言語。Delphi含まれず安心
135 :デフォルトの名無しさん[sage]:2019/08/20(火) 22:01:08.71 ID:aHZAynoR - >>133
文系の人は、文章そのものの雰囲気的な美しさに美学を見出す傾向がある。 芥川龍之介の「表現技巧(?)」が素晴らしいとか、○○氏の詩的表現は 真似できないとか。 しかし、それをプログラミングに持ち込んで欲しくない。ここでもそういう 表面的な美しさばかりにとらわれている人が多い気がする。
|