• ベストアンサー

アセンブラの実行速度

高速なオセロの終盤ソルバーを作りたいと思い、調べていると あるソルバーのソースにインラインアセンブラが使われていました。 やはり高速なプログラムを作るにはアセンブラを使うほうが高速なのでしょうか 最近のコンパイラは最適化が向上していると聞きます。 アセンブラを使うとどれくらい高速化の効果がありますか? C++はある程度わかるのですが、アセンブラはさっぱりで学ぼうか迷っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • sknbsknb2
  • ベストアンサー率38% (1123/2893)
回答No.1

こういう場合の開発方法は、 (1)アルゴリズムを考える。 (2)高級言語でアルゴリズムの有効性を確かめる。 (3)アセンブラで書くと高速化できる部分をアセンブラに置き換える。 てな感じだと思うのですが、(3)の部分は命令のクロック数まで計算して無駄な部分を削らないと意味がないでしょう。 これからアセンブラを勉強してそのレベルに到達するまでの時間を考えると、マルチコア/マルチスレッドの恩恵を得られる高級言語を使い並列計算するというアプローチの方が現実的で、かつアセンブラを使うよりも高速にできるのではないかと思います。

walawara
質問者

お礼

回答ありがとうございます。 確かに並列計算のほうが高速にできそうですね。 アセンブラは気が向いたら学んでみたいと思います。

その他の回答 (1)

回答No.2

インラインアセンブラで作られていた部分もアセンブラで作られたわけではないのでは。 高級言語で作ったけど、アセンブラ出力してみたらアセンブリ言語による少しの手直しで高速化できそうなコードを出力していたから入れ替えたとか、プロファイリングしてみて時間かかってたから考えて変更したとかじゃないかな。 アセンブリ言語使って書いたら速いなんて事はないと思いますよ。 CPUとコンパイラを良く知っている方が書けば速くも書けるでしょうけど。 ただし、より細かく書く事になるので手順は増え複雑化し時間も掛かる。 通常、アセンブラで書かざるを得ない部分なんてほとんどないだろうし、アセンブリ言語で書こうとはしないのでは。 高級言語で作ってアセンブリ言語を出力させ、アセンブリ言語で細工すれば簡単に高速化できそうなコードを出力していたり、動作解析して高速化が必要でアセンブラ使えば高速化可能そうな場合などに使うと思いますよ。 実際、一部(全部ではない)がアセンブリ言語だったわけですし。

walawara
質問者

お礼

回答ありがとうございます。 アセンブラレベルでの高速化をするにはやはり相当勉強が必要そうですね。

関連するQ&A

  • 組み込みアセンブラとは何ですか?

    私はx86でアセンブラを勉強中ですが、ネットでアセンブラ関係のことを検索していて組み込みアセンブラという記述をを見ました。 C言語から利用する場合インラインアセンブラより良いとかなんとか。 組み込みアセンブラという名前も怪しく合っているかわかりません。 掲示板のようなところで組み込みアセンブラの方が良い、早いと書いてありました。いろいろ検索して見かけたのでどこの掲示板かもわかりません。後から探したのですが見つけることができませんでした。 そこで質問なのですがそのその組み込みアセンブラとは何なんでしょうか? C言語からアセンブラを利用する場合、今読んでいる本「やさしいアセンブラ入門」にはインラインアセンブラとアセブラ言語モジュール(オブジェクトファイル)をCプログラムでリンクする方法の2種類が書いてありますが。組み込みアセンブラはモジュールで使うということでしょうか? 違うとすればどのような方法でアセンブラを利用することでしょうか? わかる方教えてください。ヨロシクお願いします。

  • C to 68000アセンブラ

    こんにちは。 早速ですが、Cプログラムを68000アセンブラに変換できるツール・コンパイラがありましたら知っている方、教えてください。 よろしくおねがいします。

  • PICプログラム C言語とアセンブラ言語

    PIC18シリーズを使用して、プログラミングをしています。コンパイラはCCS-Cです。今まではすべてC言語で書いてきたのですが、アセンブラでしか設定ができない部分があり、今までのC言語のソースに加えてアセンブラを組み合わせようと思っているのですが、C言語とアセンブラを組み合わせることは可能なのでしょうか?

  • アセンブラのマニュアルを入手したいです

    インテルの80186を使用した制御ボードがあり、アセンブラとTURBO C++のソースプログラムがあります。これからそのプログラムを変更したいのですが、プログラムを作った人がもういないので、マニュアルもありません。 マニュアルの入手方法を教えてください。

  • アセンブラの機能について

    今、アセンブラの勉強をしているのですがある書籍の説明文において 「ハードウェアすなわちコンピュータが用意している機能を原理的にはすべて使用してプログラムを作成できる。」 ということや、 「C言語などの高級言語には存在しない、ハードウェアに予め用意されている機能を利用してのプログラム製作が可能」 という記述があったのですが、具体的にアセンブラには高級言語には存在しないどのような機能が内臓されているのでしょうか? 私は多少C言語およびJavaの経験があるのですが、是非ともアセンブラとの比較を勉強したいと思い、この疑問が浮かび上がりました。 分かる方、よろしくお願いいたします。

  • アセンブラでのメモリの動的確保について

    自作コンパイラのために最近NASMを使ってアセンブラの勉強を始めたものです。 メモリ領域の確保のためにNASMでは buffer: resb 64 と宣言しますが、C++でのchar* buffer=new char[size]; のような、動的なメモリ領域の確保の記述は可能でしょうか? 普段はC++を主に使っているため、見当違いな質問かもしれませんが、よろしくお願いします。

  • 8080用のクロスコンパイラは、ないでしょうか。

    8080用のクロスコンパイラは、ないでしょうか。 TK-80シミュレーターにて、プログラム開発をしたいのですが、さすがにアセンブラはきついので、Cコンパイラを探しています。 フリーのソフトで、MS-WindowsかLinuxで動作するクロスコンパイラはないでしょうか。 (8080アセンブラを出力するCコンパイラ) 以前探したときは、(確か)C言語をZ80にコンパイルして、それをさらに8080用アセンブラに変換するのを見つけましたが、うまく動きませんでした。 何か情報をもらえるとありがたいです。 よろしくお願いします。

  • C/C++のインラインアセンブラに関する質問

    使っているコンパイラはボーランドのフリーのC++のコンパイラなのですが インラインアセンブラのソースをコンパイルするとこんなエラーメッセージがでます( 警告 W8002 roger.cpp:8アセンブラを使う為コンパイラを再起動した(関数(main()) エラーE2133 ’tamsm32.exe'を実行できない とエラーメッセージが出ます 調べても解決方法がわからないのですが 解る方は教えてください ついでにコンパイルしようとしたソースは↓です #include<iostream.h> void main(){ int w=8; int w2=5; _asm{ mov eax,w mov edx,w2 }; cout<<w<<endl; };

  • VC6でIDEでソース部分のアセンブラ表示とプロファイル

    VC6で処理の遅い部分をアセンブラで置き換えたところ、逆に遅くなりました。(^^; Cの元の部分と見比べたいので、ソースのここからここまでの間のコンパイルしたアセンブラを吐くというのは、可能でしょうか? あと、VC6のプロファイルが未だにわかっていません。 メニュー - プロジェクト - 設定 にあるリンクタブの プロファイラを使うというチェックボックスをつけても、後で見たらチェックが外れているし、C/C++タブのプロジェクトオプションに /profileを追加しても、無視されます。 私のVC6のコンパイラがおかしいのでしょうか? OSはWindows2000で、SP4で VisualStudioのSPは5です。

  • アセンブラ初心者です。

    アセンブラ初心者です。 MacOs上のターミナルでgccをつかいアセンブラのソースコードを表示させてみたら .cstring LC0: .ascii "%d \0" .text .globl _main _main: pushl %ebp movl %esp, %ebp pushl %ebx subl $36, %esp call L9 "L00000000001$pb": L9: popl %ebx movl $1, -16(%ebp) jmp L2 L3: movl $1, -12(%ebp) jmp L4 L5: movl -16(%ebp), %eax imull -12(%ebp), %eax movl %eax, 4(%esp) このようになったのですが1つ疑問があります。それはjmp命令のところでjmp L2またはjmp L4とありますがL2とL4のソースコードは表示されていません....。この部分はどうして表示されないのでしょうか?またどのようになっているのでしょうか?教えてください><ちなみにfor文をつかった単純なかけ算のプログラムをCで書きました。

専門家に質問してみよう