Home
Blog
Company
TechMemo
Contact
メニュー
スタッフブログ
会社案内
技術系備忘録
お問い合わせ
旧ホームページ
ブログ更新履歴
2024/03/11
rlib-MML 機能追加しました
2023/12/16
rlib-MML アプリ ver1.0.6 公開しました
2023/11/13
rlib-MML 機能追加しました
2023/01/06
rlib-MML アプリ ver1.0.5 公開しました
2021/12/01
rlib-MML アプリ 更新しました
コンテンツ更新履歴
最新の30件
2022-10-24
技術系備忘録/Windows/接続されているモニタ以上の解像度でデスクトップ表示
2021-10-14
技術系備忘録/C++/小技/無名関数の再帰をローテクで
2021-08-10
技術系備忘録/C++/小技
2021-08-08
技術系備忘録/C++/小技/型で条件分岐
2021-06-10
技術系備忘録/Docker/サーバー死活監視スクリプト
2021-03-29
技術系備忘録/C++/Boost/boost.formatを使った文字列フォーマット。printf系関数を置き換え
2020-10-21
技術系備忘録/VMware/Ubuntu8.10にVMwareServer1.0をインストール
2020-10-14
技術系備忘録/VMware
技術系備忘録/VMware/CentOS7にVMwarePlayer12をインストール
2020-06-03
技術系備忘録/TypeScript/二分探索(binary search)
2020-06-01
技術系備忘録/Docker/SSLアクセラレータ&リバースプロキシ
2019-11-08
技術系備忘録/C++/OpenSSL/ビルド方法
2019-11-04
技術系備忘録/C++/VisualStudio/MSBuild.exeのパスを解決して実行
2019-10-02
MenuBar
2019-09-05
技術系備忘録/Docker
2019-09-04
技術系備忘録/Docker/LAMP環境構築
2019-07-16
会社案内/品質管理方針
2019-04-18
技術系備忘録/AWS/SoftEtherを使ってVPN接続
2019-02-18
技術系備忘録/C++/小技/std.set map系の比較関数の新機能
2018-05-25
技術系備忘録/データベース
技術系備忘録/データベース/SQLite
技術系備忘録/データベース/SQLite/WHERE IN で複数指定するクエリ
2018-05-20
会社案内/求人情報
2018-01-11
技術系備忘録/AWS/EC2 AmazonLinuxにSWAPを設定
技術系備忘録/AWS
2017-11-21
技術系備忘録/C++/Boost/インストール手順
2017-10-25
技術系備忘録/C++/Boost
技術系備忘録/C++/VisualStudio
技術系備忘録/C++/Boost/boost.asioコルーチン内で表コンテキストの処理を行う
2017-10-17
技術系備忘録/C++/VisualStudio/デバッガでstd.stringをUTF-8で表示
リンク
rlib-MML デモページ
MML (Music Macro Language) をコンパイルし、再生や標準MIDIファイル出力をブラウザ上で行える形にまとめています。
Magome
クラウドベースのMIDIシーケンサ
音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています。
twitter
Tweets by thinkridge
(有)シンクリッジは 技術者 を募集しております。
|
一覧
検索
最新
ヘルプ
ページへ戻る
履歴
印刷
技術系備忘録/C++/最適化小手先テクニック/try~throw~catchの乱用を避けるべし
のソース
xpwiki
:
技術系備忘録
/
C++
/
最適化小手先テクニック
/
try~throw~catchの乱用を避けるべし
のソース
差分
を表示
技術系備忘録/C++/最適化小手先テクニック/try~throw~catchの乱用を避けるべし
へ行く。
通説ですが、try~throw~catch は遅いです。 便利に使える場面もありますが、パフォーマンスが気になるところでは、なるべく使わないほうがよいでしょう。 どの程度のパフォーマンスかを実際に調べてみました。 -List1 #prettify{{ class CTest { public: enum{ TABLESIZE = 100, }; int m_Table[TABLESIZE]; public: CTest(); int CaseGoto(); int CaseTry(); virtual void OnExcept(){} }; CTest::CTest() { ::memset(m_Table,0,sizeof(m_Table)); m_Table[0] = 1; } int CTest::CaseGoto() { int nCount = 0; for(int i=0; i<1000000; i++ ){ for(int x=0; x<TABLESIZE; x++ ){ if( m_Table[x] != 0 ){ OnExcept(); // 最適化されないように念のため goto next; // throwと比較しやすいようにgoto使ってます } } nCount++; next:; } return nCount; } int CTest::CaseTry() { int nCount = 0; for(int i=0; i<1000000; i++ ){ try{ for(int x=0; x<TABLESIZE; x++ ){ if( m_Table[x] != 0 ){ OnExcept(); // 最適化されないように念のため throw false; } } nCount++; }catch(...){ } } return nCount; } }} CTest::CaseGoto と CTest::CaseTry の処理時間をそれぞれ計測してみると、 CTest::CaseGoto が 10ms、 CTest::CaseTry が 7551ms、 と、サンプルコードが特殊ではありますが、かなりの差があります。 (Pentium3 1.2G のマシンでVC++6を使用) try~catch は、関数をまたいで goto 出来るうえ、ローカルクラスのデストラクタ処理なども考慮されており、使い勝手はC言語の頃からある setjmp~longjmp 以上の物なのですが、便利な分、遅いです。 例外処理本来の意味で、深いネスト(関数)からエラー処理の為に脱出するような使い方であれば良いと思うのですが、サンプルコードのように、普通の条件分岐で記述できる箇所では使わないようにしたほうが、パフォーマンスの面では有利だと思います。 さらに、ちょっと愚痴っぽくなりますが、 本来 goto文 を使うべき箇所(*1)で、goto文 を避ける為に try~catch を使っているような場合も、パフォーマンスの面だけでなく考慮してほしいな思うことがあります。 VisualC++ を使ってデバッガ上で実行すると、throw が発生する度に、出力ウインドウに"例外処理・・・"というメッセージが表示されます。 開発業務等で外部提供のモジュールを使用するケースはよくあると思いますが、 その外部モジュールが、通常フローにも関わらず throw 連発しているような物だったら、しかも常に処理が走り throw 連発するような物だったら、 出力ウインドウが"例外処理・・・"で埋め尽くされてしまいます。 自分で入れたデバッグメッセージは一瞬で流されて見れたもんじゃありません。 どうにかならないもんでしょうか・・・って誰にも文句を言えないとこにプログラマの辛い面を感じました。 なにはともあれ、try~catch を何も考えずに使うのは止めたほうが良いと思います。 /* setjmp はメモリ上にスタック環境を保持しておき、longjmp でその状態を戻すというアクロバティックな動作をします。普通の条件分岐とは訳が違います。 その為か setjmp~longjmp は特殊で難しく、コードの見通しも悪くなるのでなるべく使わないようにしましょうとまで言われていた関数だったのですが、 C++では try~catch として言語仕様としてサポートされた訳です。 そう考えると、C言語の時代でも setjmp~longjmp をもっと便利に使うべきだったのかなと思います。 */ /* 本件は C++ における try~catchのパフォーマンスについて述べています。 JAVA や C# は try~catch を使うことが大前提のような仕様になってますので遠慮なく使っていいと思います。(パフォーマンスはわかりません) */ ---- *1 goto文は使ってはいけないとか、場合によっては使うべしという意見がありますが、自分は後者です。
技術系備忘録/C++/最適化小手先テクニック/try~throw~catchの乱用を避けるべし のバックアップソース(No. All)
現: 2016-04-01 (金) 13:29:53
takatsuka
ぺージ情報
ぺージ名 :
技術系備忘録/C++/最適化小手先テクニック/try~throw~catchの乱用を避けるべし
ページ別名 :
未設定
ページ作成 :
takatsuka
閲覧可
グループ :
すべての訪問者
ユーザー :
すべての訪問者
編集可
グループ :
なし
ユーザー :
なし
Counter: 2053, today: 1, yesterday: 0