[過去ログ]
FreeBSDを語れ Part49 (1002レス)
FreeBSDを語れ Part49 http://mevius.5ch.net/test/read.cgi/unix/1567770470/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
133: 名無しさん@お腹いっぱい。 [sage] 2019/09/13(金) 19:57:49.49 >>130 Cなら if ( checkfunc( func ) ) ... と1行で書けるから大したことなさそうに見えるけど、これをアセンブラで書くと、 汎用レジスタ全部退避して、戻りアドレス設定して、新しいスタックポインタ設定して、 チェック処理を実行して、戻る直前に汎用レジスタ全部戻してリターンするので、 毎回こんだけの処理させてわざわざ遅くするのが嫌になるんだよね。 全レジスタの退避と復帰を毎回実行させるのってほんとに無駄に感じる。 本当は、破壊されてもいいレジスタは関数ごとに異なるはずなので、破壊されて困るレジスタだけ退避 するようにすれば最適化されていいんだけど、そうするとどこかを書き換えたとき、元に戻さないといけない レジスタができて、それの退避を忘れただけで吹っ飛ぶ。 http://mevius.5ch.net/test/read.cgi/unix/1567770470/133
134: 名無しさん@お腹いっぱい。 [sage] 2019/09/13(金) 20:16:21.30 >>133 三行にまとめてくんないと、1ミリも理解できないんだけど http://mevius.5ch.net/test/read.cgi/unix/1567770470/134
149: 名無しさん@お腹いっぱい。 [sage] 2019/09/14(土) 10:12:55.40 >>133 レジスタ退避と復帰は専用の命令が有るけど、CPUは実際には見えてる以上にレジスタを持ってるから毎回律儀にメモリに退避とかしてないよ http://mevius.5ch.net/test/read.cgi/unix/1567770470/149
152: 名無しさん@お腹いっぱい。 [sage] 2019/09/14(土) 13:04:16.01 >>133は、アセンブラでコード書いてると自然にそうなるってこと。 ルーチン内ではできるだけ汎用レジスタを使って処理したほうが早くなるから、最初にメモリから必要なデータを持ってきた後は 極力レジスタだけで処理するように書く。後からその処理の途中に別の処理を入れることになって、別の関数を挟んだとすると レジスタの値を変えてはいけないから、その関数に入ったところで全レジスタを待避し、関数の終わりで戻さないといけなくなる。 Cで同じことをしてアセンブラに展開したコードを見ると、変数の値はメモリに置いておき、必要になったらレジスタにロードして 計算したら結果をまたメモリに戻すという処理をしている。後から途中に関数が追加されても、その関数はメモリから値を 持ってきて処理するからレジスタを退避する必要はない。関数に渡すパラメータなどもスタックに入れて渡すから 同じくレジスタを退避しなくて良い。 しかしこのやり方ではメモリとレジスタ間のセーブ/ロードが頻繁に起こるので、アセンブラのソースで見るといかにも効率が悪くて 遅いとわかる。当たり前だがメモリ - レジスタ間のセーブ/ロードはレジスタ内だけの演算よりずっと遅い。 そうするくらいなら、必要なときだけレジスタを退避・復帰させた方がまし。さらに、これがforなどのループ内で使われた場合、 この遅さがプログラム全体の遅さになる。Cコンパイラのコード生成は、アセンブラから見れば遅くて無駄だらけに見える。 その分、ソースが見やすいから便利なんだけれども。 http://mevius.5ch.net/test/read.cgi/unix/1567770470/152
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.034s