Guru Best Practices: C and Server Coding
by Michael (Monty) Widenius, Brian Aker
MySQLのFounderとDirector of Architectureによるdeepなセッション:
- Portabilityの高いコード,コードの効率性を維持,可読性の高いC,C++,アセンブラコードを実現するためにどうすべきか
- どのアルゴリズムを使うか,アプリケーションがThreadベースかProcessベースか,どのOS,CPUかについてはここでは考えない
- 重要ポイント:Portability, Speed, Code Size, Memory usage, Readability, Language use
- 例えば,どれほどメモリの使い方が効率的であっても可読性が非常に低いコードは駄目
- 参加者は40名程度,アセンブラ書ける人はこのうち2/3.僕以外の参加者は皆さん凄い人達っぽい.
- Monty「アセンブラは大事,コンパイラがどのようにコンパイルするか理解」
- MySQL Axioms:コードのduplicate(コピペ)禁止,巨大な関数を作るの禁止,STL禁止,strlen()およびstrcatはなるべく使わない,関数のデフォルト引数は使わない,variable nameで渡すのは避ける,標準的なシンタックスを使う,初回コーディングでしっかり書く,don't check validity of function arguments, trust caller,変数はちゃんと初期化する,goto文は必要なら使っても構わない.
- Suggestions:Indexよりもポインタを使え(Cは素晴らしい言語だ.ポインタを使える.),#ifdefsは".c"および".cc"ソースファイルには極力書かない,templatesは避けろ(castする場合にはOK),mallocsは使用を避けろ,コードを大きくまたがってMutexを使うのを避けろ,overlay operatorsをするな(可読性が低下する),可能なら再利用可能なブラックボックスを作ってあなたの問題を解決しろ.
- Methods to use:Virtual Functionは効率良い(Item,Field,Handler),インデックス変数を使うな,Loop unroll for critical code,Only hard-optimize bottleneckes.
- Inline Functions:関数は短く(数行),関数はパフォーマンスに影響が深い部分で何度も使われる.
- アセンブラでの開発の利点:コンパイラが何をしたか学べる,2倍はスピードが速い,コンパイラを使った場合に比べて30%はアセンブラコードが短い.
- アセンブラをどこで使うか:小さいモジュール,CPU intensiveなモジュール,パフォーマンスに占める比重の高い場所
- Alignment:構造体に含まれる変数は小さいサイズにする,Less holes in structures(especially for 64bit!).
- Function return values:成功したらステータス0を返すという風にはしないほうが良い
- インデックス変数の代わりにポインタを使うコード例の紹介
- もう1つ例を紹介
for (i=0l i < length; i++) if(str[i] == 'a') str[i]='b'; for (end=str+length; str < end; str++) if(*str=='a') *str='b';
- Brianは昔MicrosoftでVisualStudioを開発していた?
- strcatの使用を避ける例
strcat(to, "hello"); strcat(to, "world"); strmov(strmov(to, "hello"), "world"); strmov(strmov(to, "hello", "world", (char*) 0);
- 変数はなるべくブロックの必要最小限の場所(内側)で宣言しろ
感想.生粋の技術者おやじMontyによるプログラミングノウハウ講座.アセンブラは一度ちゃんとやらないといかんとこの間から思っていたけれども,改めてMontyにアセンブラは大事と言われた.MySQL ABの開発者も何人も受講していた.というか,Davidさんもこっそり参加.某ポータルサイト.jpの方と会った.確かjpの方ではあまりMySQLは使っていないと昨年,某ポータルサイト.comの方から聞いていたけれども,これからMySQLを使っていくのだろうか.楽しみ.