設計上2次関数であるアルゴリズムの最適化
本記事では、設計上2次時間(O(n²))で動作するアルゴリズムを、実用的な制約条件下で実際にどれだけ高速化できるかを検証する。理論的な限界に縛られず、データ特性や実装の工夫を活かした最適化手法を紹介し、実際のパフォーマンス測定結果とともにその効果を評価する。
背景メモ
- 本記事は、オンラインのコード進行解析ツール「WhatChord」のパフォーマンス改善手法を解説している。開発者はEarthmanmuons氏。
- WhatChordは、音階と調性(キー)を指定すると、そのキーに属するダイアトニックコードの進行候補をレコメンドするウェブアプリ。音楽理論の知識が浅い作曲家や、コード進行のアイデア出しに使う層が主なユーザー。
- 問題の核心:コード数を増やすと、全組み合わせを評価するロジックがO(n²)で計算量が爆発する。処理速度が実用に耐えなくなる閾値を記事は「12〜13コード」としている。
- 改善策として記事が採用するのは、C++のSIMD(Single Instruction, Multiple Data)命令を使ったベクトル化と、マルチスレッド並列処理の2点。どちらもモダンなCPUの機能を直接叩く、やや高度な最適化手法。
- コンテクストとして:WhatChordはもともと筆者が音楽理論の勉強のために作った個人ツールだったが、公開後に予想外のトラフィックが発生し、サーバーサイドのアルゴリズム改善が必要になったという背景がある。