156 lines
4.1 KiB
Markdown
156 lines
4.1 KiB
Markdown
|
|
# JIT論文評価方法論
|
|||
|
|
|
|||
|
|
## 評価の3本柱(Gemini先生提案)
|
|||
|
|
|
|||
|
|
### 1. 性能評価
|
|||
|
|
- **ベースライン**: インタープリター、VM(JITなし)
|
|||
|
|
- **比較対象**: GraalVM/Truffle、V8(可能な範囲で)
|
|||
|
|
- **測定項目**:
|
|||
|
|
- スループット(ops/sec)
|
|||
|
|
- レイテンシ(関数呼び出し)
|
|||
|
|
- メモリ使用量
|
|||
|
|
- コンパイル時間
|
|||
|
|
|
|||
|
|
### 2. 回復力評価
|
|||
|
|
- **故障注入実験**:
|
|||
|
|
- JIT内部での意図的panic
|
|||
|
|
- メモリ不足状況
|
|||
|
|
- 無限ループ検出
|
|||
|
|
- **測定項目**:
|
|||
|
|
- フォールバック成功率
|
|||
|
|
- 復旧時間
|
|||
|
|
- 状態の一貫性
|
|||
|
|
|
|||
|
|
### 3. モジュール性評価
|
|||
|
|
- **拡張性テスト**:
|
|||
|
|
- 新しい型の追加(Complex、Decimal等)
|
|||
|
|
- バックエンド交換(Cranelift→LLVM)
|
|||
|
|
- 新しい最適化パスの追加
|
|||
|
|
- **測定項目**:
|
|||
|
|
- 変更必要行数
|
|||
|
|
- インターフェース安定性
|
|||
|
|
- ビルド時間への影響
|
|||
|
|
|
|||
|
|
## 実験計画
|
|||
|
|
|
|||
|
|
### Phase 1: マイクロベンチマーク(実施済み)
|
|||
|
|
✅ 基本演算(整数、浮動小数点)
|
|||
|
|
✅ 制御フロー(分岐、ループ)
|
|||
|
|
✅ PHIノード(値の合流)
|
|||
|
|
|
|||
|
|
### Phase 2: アプリケーションベンチマーク(計画中)
|
|||
|
|
- [ ] フィボナッチ数列(再帰 vs ループ)
|
|||
|
|
- [ ] 素数判定(計算集約型)
|
|||
|
|
- [ ] ソートアルゴリズム(配列操作)
|
|||
|
|
- [ ] 簡易インタープリター(複雑な制御)
|
|||
|
|
|
|||
|
|
### Phase 3: ストレステスト(計画中)
|
|||
|
|
- [ ] 長時間実行(メモリリーク検証)
|
|||
|
|
- [ ] 並行実行(マルチスレッド環境)
|
|||
|
|
- [ ] エラー注入(ランダムfault)
|
|||
|
|
|
|||
|
|
### Phase 4: 比較評価(計画中)
|
|||
|
|
- [ ] Node.js相当ベンチマーク移植
|
|||
|
|
- [ ] Python相当ベンチマーク移植
|
|||
|
|
- [ ] 実行時間・メモリ使用量比較
|
|||
|
|
|
|||
|
|
## データ収集自動化
|
|||
|
|
|
|||
|
|
### ベンチマークハーネス
|
|||
|
|
```nyash
|
|||
|
|
// benchmark_suite.nyash
|
|||
|
|
static box BenchmarkRunner {
|
|||
|
|
init { timer, results }
|
|||
|
|
|
|||
|
|
constructor() {
|
|||
|
|
me.timer = new TimerBox()
|
|||
|
|
me.results = new MapBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
runBenchmark(name, func, iterations) {
|
|||
|
|
local start = me.timer.now()
|
|||
|
|
|
|||
|
|
loop(i < iterations) {
|
|||
|
|
func()
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local elapsed = me.timer.now() - start
|
|||
|
|
me.results.set(name, elapsed / iterations)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
exportResults() {
|
|||
|
|
return me.results.toJson()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 統計収集スクリプト
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
# collect_stats.sh
|
|||
|
|
|
|||
|
|
echo "=== Nyash JIT Benchmark Suite ==="
|
|||
|
|
|
|||
|
|
# 環境変数設定
|
|||
|
|
export NYASH_JIT_EXEC=1
|
|||
|
|
export NYASH_JIT_THRESHOLD=1
|
|||
|
|
export NYASH_JIT_STATS_JSON=1
|
|||
|
|
|
|||
|
|
# 各ベンチマーク実行
|
|||
|
|
for bench in benchmarks/*.nyash; do
|
|||
|
|
echo "Running: $bench"
|
|||
|
|
./target/release/nyash --backend vm "$bench" > "results/$(basename $bench .nyash).json"
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
# 結果集計
|
|||
|
|
python3 aggregate_results.py results/*.json > final_report.md
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 再現性の確保
|
|||
|
|
|
|||
|
|
### 環境記録
|
|||
|
|
- Git commit hash
|
|||
|
|
- Rustコンパイラバージョン
|
|||
|
|
- OS/カーネル情報
|
|||
|
|
- CPU/メモリ情報
|
|||
|
|
- 環境変数設定
|
|||
|
|
|
|||
|
|
### 結果アーカイブ
|
|||
|
|
```
|
|||
|
|
results/
|
|||
|
|
├── 2025-08-27/
|
|||
|
|
│ ├── environment.json
|
|||
|
|
│ ├── raw_data/
|
|||
|
|
│ │ ├── fib_recursive.json
|
|||
|
|
│ │ ├── fib_iterative.json
|
|||
|
|
│ │ └── ...
|
|||
|
|
│ └── summary_report.md
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 統計的妥当性
|
|||
|
|
|
|||
|
|
### 測定方法
|
|||
|
|
1. **ウォームアップ**: 最初の10回は除外
|
|||
|
|
2. **繰り返し**: 最低100回実行
|
|||
|
|
3. **外れ値除去**: 上下5%を除外
|
|||
|
|
4. **信頼区間**: 95%信頼区間を算出
|
|||
|
|
|
|||
|
|
### レポート形式
|
|||
|
|
- 平均値 ± 標準偏差
|
|||
|
|
- 中央値(外れ値の影響を排除)
|
|||
|
|
- 最小値・最大値
|
|||
|
|
- ヒストグラム(分布の可視化)
|
|||
|
|
|
|||
|
|
## 論文での提示方法
|
|||
|
|
|
|||
|
|
### 図表案
|
|||
|
|
1. **性能グラフ**: ベンチマーク別の実行時間比較
|
|||
|
|
2. **フォールバック率**: エラー注入量とフォールバック成功率
|
|||
|
|
3. **モジュール性**: 機能追加時の変更行数比較
|
|||
|
|
4. **アーキテクチャ図**: 箱境界とJIT/VMの関係
|
|||
|
|
|
|||
|
|
### 主張の裏付け
|
|||
|
|
- 定量的データ(ベンチマーク結果)
|
|||
|
|
- 定性的分析(コード複雑度、保守性)
|
|||
|
|
- 事例研究(実際の拡張例)
|