SlideShare a Scribd company logo
1 of 13
プログラムの高速化
豊田高専 関口 恵太
自己紹介
本題に入る前に軽く自己紹介を…
豊田高専 電気・電子システム工学科 4年
関口 恵太
1年次 : 製作班
2年次 : マネージャー
3年次 : 全体リーダー(兼プログラマ?)
4年次 : RoboCup 回路班
高速化の意義
近年のPCではスペックの向上により高速化の必要はないように思わ
れる
ではなぜここであらためて高速化を紹介するのか…
↓
高速化をするということはアセンブラレベルでの命令数の削減となり、
容量の限られている環境では実行速度だけではなく、プログラムを書
ける量の増加にもつながる
最適化
では、実際にどのようにすればよいか?
一般にはコンパイラの最適化オプションを有効にするだけでも良い。
…しかし、コンパイラによる最適化ではプログラマが意図したのとは別
の動作になることもしばしばある。
そこで、最適化オプションを使わずに手動で高速化する方法を紹介す
る。
手法①
• 繰り返しはカウントダウンで
例 int i;
for(i = 0; i < HOGE; i++)
↓
for(i = HOGE; i > 0; i--)
終了条件の判定はZフラグを見ており、条件を0にしてやれば条件比
較をしなくてもZフラグが立つためアセンブラレベルでは命令数が減る
ため(環境による)
(速度は体感できるレベルではないが使用メモリは削減できる)
手法②
• 繰り返しそのものを見直す
先ほど、「繰り返しはカウントダウンで」と言いました。アセンブラレベルで命
令数が少なくなるからです。
どの環境でもそうでしょうか?答えは否です。
では3種類あるループのうちどれが最も命令数が少なかったのでしょうか…
結果からいうとdo~whileです。この結果を招いた要因は継続判定のタイミン
グにあります。do~whileは最後に判定をするのに対して残りの二つは最初
に判定をしているため、余分な命令が必要になってしまいます。
(具体的には、ループから抜けるためのジャンプに加えて先頭に戻るための
ジャンプ)
手法③
• 関数を「static inline」修飾する
例 uint16_t GetBatteryVoltage(void){
return HOGE;
}
↓
static inline uint16_t GetBatteryVolutage(void){
return HOGE;
}
関数は呼び出される際に少なからずオーバーヘッドが発生する。
インライン展開を行うことで関数を呼び出すのではなくその位置に埋め込まれる。
(関数内の処理によっては展開されないこともある。また、static修飾をしていない
場合も展開されないことがある)
手法④
• 値渡しではなくポインタ渡しをする
例 void Func1(struct Data_t dat){
hoge;
}
↓
void Func1(struct Data_t* dat){
hoge;
}
値渡しでは、引数とした変数がメモリ空間の別の場所にコピーされるので特にサ
イズの大きな構造体やインスタンスでは時間がかかる(体感ではゼロ時間)。これ
を参照渡しにすることでコピーは発生せず時間が短縮できる。
ただし、参照したからといって関数内で実体をコピーしていたらこれをするメリット
はない(と思う)
手法⑤
• mallocを多用するならメモリプールを作る
(例はちょっと難しいかな…)
メモリを確保するにも当然時間はかかる。かかる時間の一部は、メ
モリの管理情報を付加しないといけないということ。(OSが認知してい
ないといけないから)
そして、ちまちまメモリを確保していると当然のごとく情報の付加回
数は多くなる。256byteを256回で確保するのと1回で確保するのとで
は後者のほうが早い(情報付加が1回で済むため)。
そこで、あらかじめメモリをまとめて確保しておき必要な量をそこから
割り当てるようにすればよい(これがメモリプール)
手法⑥
• 「register」修飾(アーキテクチャ的な話になります)
例 int i;
for(i = 0;i < 1000000; i++)
hoge;
↓
register int i;
for(i= 0; i < 1000000; i++)
hoge;
CPUにとってメモリアクセスはものすごく(?)遅い
高速化するためにCPUにはキャッシュメモリが設けられているが、実際の計算時
にはレジスタに格納する必要がありそのためのアクセスに時間を要する。そこで
最初からこのレジスタに変数を確保するのがこのキーワードである。register修飾
された変数はアドレス参照することはできない。
手法⑦
• 変数の「static」修飾(何回も呼び出される関数を想定してください)
例 void Func1(){
int hoge;
hoga;
}
↓
void Func1(){
static int hoge;
hoge++;
hoga;
}
一つ目のFunc1では関数が呼び出されるたびにhogeが確保され関数終了時には破棄されてしまう。つまり、呼び出すたびに再確保
という無駄時間が存在する。対して、下の関数ではstatic宣言をしているため破棄されずに常に残っているため無駄時間が発生し
ない。
もっというと、static変数は.bssセクションに確保されるため必ずゼロで初期化されています。(C言語の規則です。)セクションはコンパ
イル時の配置に関する部分(のはず)なので説明は省きますが、気になったらググるなりどうぞ。リンカスクリプトを読んでもいいかも
データほしい方、取りに来てくれたらじゃんじゃん差し上げます。
※発表してないスライドもあります(マイコン関連)
御静聴ありがとうございました

More Related Content

Viewers also liked

無線LANでロボットを動かす話
無線LANでロボットを動かす話無線LANでロボットを動かす話
無線LANでロボットを動かす話
Hisaya Okada
 

Viewers also liked (12)

岐阜高専B-ロボット紹介
岐阜高専B-ロボット紹介岐阜高専B-ロボット紹介
岐阜高専B-ロボット紹介
 
MDの基本と応用について
MDの基本と応用についてMDの基本と応用について
MDの基本と応用について
 
富山本郷キャンパス-ロボット紹介
富山本郷キャンパス-ロボット紹介富山本郷キャンパス-ロボット紹介
富山本郷キャンパス-ロボット紹介
 
岐阜高専A-ロボット紹介
岐阜高専A-ロボット紹介岐阜高専A-ロボット紹介
岐阜高専A-ロボット紹介
 
鈴鹿高専ロボコン 部活紹介と技術紹介
鈴鹿高専ロボコン 部活紹介と技術紹介鈴鹿高専ロボコン 部活紹介と技術紹介
鈴鹿高専ロボコン 部活紹介と技術紹介
 
富山高専射水キャンパス ロボット紹介
富山高専射水キャンパス ロボット紹介富山高専射水キャンパス ロボット紹介
富山高専射水キャンパス ロボット紹介
 
OpenCVを用いたロボコンにおける画像処理(2013年ロボコン交流会)
OpenCVを用いたロボコンにおける画像処理(2013年ロボコン交流会)OpenCVを用いたロボコンにおける画像処理(2013年ロボコン交流会)
OpenCVを用いたロボコンにおける画像処理(2013年ロボコン交流会)
 
無線LANでロボットを動かす話
無線LANでロボットを動かす話無線LANでロボットを動かす話
無線LANでロボットを動かす話
 
私の失敗道(仮)
私の失敗道(仮)私の失敗道(仮)
私の失敗道(仮)
 
C#/Java & Linux で始める ET ロボコン(leJOS編)
C#/Java & Linux で始める ET ロボコン(leJOS編)C#/Java & Linux で始める ET ロボコン(leJOS編)
C#/Java & Linux で始める ET ロボコン(leJOS編)
 
沼津高専ロボコン部 部活動紹介
沼津高専ロボコン部 部活動紹介沼津高専ロボコン部 部活動紹介
沼津高専ロボコン部 部活動紹介
 
奈良高専-2016年度東北交流会発表資料
奈良高専-2016年度東北交流会発表資料奈良高専-2016年度東北交流会発表資料
奈良高専-2016年度東北交流会発表資料
 

Similar to プログラムの高速化

コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料
futada
 
第2回勉強会資料 岩本(配布用)
第2回勉強会資料 岩本(配布用)第2回勉強会資料 岩本(配布用)
第2回勉強会資料 岩本(配布用)
Takahisa Iwamoto
 

Similar to プログラムの高速化 (20)

あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
『これからはじめるプログラミング基礎の基礎』 のエッセンス
『これからはじめるプログラミング基礎の基礎』 のエッセンス『これからはじめるプログラミング基礎の基礎』 のエッセンス
『これからはじめるプログラミング基礎の基礎』 のエッセンス
 
コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料
 
apasec001-kawai
apasec001-kawaiapasec001-kawai
apasec001-kawai
 
PowerShell DSC と連携して監視を効率化してみる
PowerShell DSC と連携して監視を効率化してみるPowerShell DSC と連携して監視を効率化してみる
PowerShell DSC と連携して監視を効率化してみる
 
cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行
 
X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmos
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
第2回勉強会資料 岩本(配布用)
第2回勉強会資料 岩本(配布用)第2回勉強会資料 岩本(配布用)
第2回勉強会資料 岩本(配布用)
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム
 
俺とSe(自己紹介)
俺とSe(自己紹介)俺とSe(自己紹介)
俺とSe(自己紹介)
 
俺とCiとinfrastructure as code(未完)
俺とCiとinfrastructure as code(未完)俺とCiとinfrastructure as code(未完)
俺とCiとinfrastructure as code(未完)
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki public
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
 

More from 東海北陸ロボコン 交流会

More from 東海北陸ロボコン 交流会 (8)

富山高専射水キャンパス
富山高専射水キャンパス富山高専射水キャンパス
富山高専射水キャンパス
 
mbedのすゝめ(追加バージョン)
mbedのすゝめ(追加バージョン)mbedのすゝめ(追加バージョン)
mbedのすゝめ(追加バージョン)
 
岐阜Bノブちゃんズ
岐阜Bノブちゃんズ岐阜Bノブちゃんズ
岐阜Bノブちゃんズ
 
第二回東海北陸ロボコン交流会 豊田高専プレゼン
第二回東海北陸ロボコン交流会 豊田高専プレゼン第二回東海北陸ロボコン交流会 豊田高専プレゼン
第二回東海北陸ロボコン交流会 豊田高専プレゼン
 
第二回東海北陸ロボコン交流会 鈴鹿高専プレゼン
第二回東海北陸ロボコン交流会 鈴鹿高専プレゼン第二回東海北陸ロボコン交流会 鈴鹿高専プレゼン
第二回東海北陸ロボコン交流会 鈴鹿高専プレゼン
 
第二回東海北陸ロボコン交流会 川上プレゼン
第二回東海北陸ロボコン交流会 川上プレゼン第二回東海北陸ロボコン交流会 川上プレゼン
第二回東海北陸ロボコン交流会 川上プレゼン
 
第二回東海北陸ロボコン交流会 井木プレゼン
第二回東海北陸ロボコン交流会 井木プレゼン第二回東海北陸ロボコン交流会 井木プレゼン
第二回東海北陸ロボコン交流会 井木プレゼン
 
第二回東海北陸ロボコン交流会 関口プレゼン
第二回東海北陸ロボコン交流会 関口プレゼン第二回東海北陸ロボコン交流会 関口プレゼン
第二回東海北陸ロボコン交流会 関口プレゼン
 

Recently uploaded

Recently uploaded (10)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

プログラムの高速化