# バッチ設計書 18-bench

## 概要

本ドキュメントは、Prettierプロジェクトにおける `bench.js` バッチの設計仕様を定義します。このバッチは、Prettierのフォーマット処理のパフォーマンスベンチマークを実行するスクリプトです。

### 本バッチの処理概要

このバッチは、指定されたバージョンのPrettierを使用してソースコードをフォーマットし、そのパフォーマンスを測定します。シリアル実行とパラレル実行の2つのモードをサポートしています。

**業務上の目的・背景**：Prettierのパフォーマンス改善や回帰を検出するために、フォーマット処理の実行時間を測定する必要があります。異なるバージョン間でのパフォーマンス比較や、最適化の効果測定に使用されます。複数回の実行でより正確な測定結果を得るため、グループ単位での繰り返し実行をサポートしています。

**バッチの実行タイミング**：パフォーマンスの検証や比較が必要な際に手動で実行します。通常はcompare.shスクリプトから呼び出されます。

**主要な処理内容**：
1. コマンドライン引数からバージョン、実行モード、グループ数、グループサイズを取得
2. 指定バージョンのPrettierをインポート
3. ベンチマーク対象ファイルを読み込む
4. 指定されたグループ数分ループを実行
5. 各グループでシリアルまたはパラレルでフォーマットを実行

**前後の処理との関連**：このバッチは通常、compare.shから呼び出されます。compare.shがビルド済みのPrettierを準備し、bench.jsを実行します。hyperfineツールと組み合わせて使用されることを想定しています。

**影響範囲**：このバッチ自体はファイルの変更を行いません。標準出力に結果を出力しますが、実際のベンチマーク結果はhyperfineなどの外部ツールで計測されます。

## バッチ種別

ベンチマーク / パフォーマンス測定

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（パフォーマンス検証時） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動実行 / compare.shからの呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js環境 | Node.js実行環境が利用可能であること |
| ビルド済みPrettier | 指定バージョンのPrettierがビルド済みであること |
| ベンチマーク対象ファイル | 対象ファイルが存在すること |

### 実行可否判定

指定バージョンのPrettierがビルド済みであり、ベンチマーク対象ファイルが存在する場合に実行可能です。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| version | string | Yes | なし | Prettierバージョン（ディレクトリ名） |
| method | string | Yes | なし | 実行モード（serial/parallel） |
| groupCount | number | No | 100 | グループ数（外側ループの回数） |
| groupSize | number | No | 10 | グループサイズ（内側ループの回数） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ./{version}/dist/index.mjs | ES Module | ビルド済みPrettierモジュール |
| ベンチマーク対象ファイル | JavaScript/TypeScript | フォーマット対象のソースコード |

### 環境変数

| 変数名 | 説明 | デフォルト値 |
|-------|------|-------------|
| PRETTIER_PERF_FILENAME | ベンチマーク対象ファイルのパス | ../../src/language-js/utilities/index.js |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| なし | - | ファイル出力なし（実行のみ） |

### 出力ファイル仕様

ファイル出力はありません。

## 処理フロー

### 処理シーケンス

```
1. コマンドライン引数の解析
   └─ version: ベンチマーク対象バージョン
   └─ method: 実行モード（serial/parallel）
   └─ groupCount: グループ数（デフォルト100）
   └─ groupSize: グループサイズ（デフォルト10）

2. Prettierのインポート
   └─ ./{version}/dist/index.mjsから動的インポート

3. ベンチマーク対象ファイルの読み込み
   └─ PRETTIER_PERF_FILENAME環境変数またはデフォルトパス

4. ベンチマークループ
   └─ groupCount回の外側ループ
   └─ 各イテレーションでmethod（serial/parallel）に応じた処理

5. シリアル実行（method === "serial"）
   └─ groupSize回の逐次実行
   └─ 各回でawait format()

6. パラレル実行（method === "parallel"）
   └─ groupSize個のformat()をPromise.allSettledで同時実行
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[引数解析]
    B --> C[Prettier動的インポート]
    C --> D[対象ファイル読み込み]
    D --> E[i = 0]
    E --> F{i < groupCount?}
    F -->|はい| G{method}
    G -->|serial| H[逐次format実行 x groupSize]
    G -->|parallel| I[並列format実行 x groupSize]
    H --> J[i++]
    I --> J
    J --> F
    F -->|いいえ| K[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

データベース操作はありません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | インポートエラー | 指定バージョンのPrettierが存在しない | ビルドを実行 |
| - | ファイル読み込みエラー | ベンチマーク対象ファイルが存在しない | ファイルパスを確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

1. Prettierが見つからない場合：該当バージョンのビルドを実行
2. ファイルが見つからない場合：PRETTIER_PERF_FILENAME環境変数を確認

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | groupCount x groupSize回のフォーマット |
| 目標処理時間 | ベンチマーク対象のため目標なし |
| メモリ使用量上限 | 制限なし |

## 排他制御

同時実行の制限はありません。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| なし | - | ログ出力は実装されていません |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | - | - |

## 備考

- ES Modules形式で実装されています
- 動的インポートを使用して指定バージョンのPrettierを読み込みます
- パーサーはTypeScriptに固定されています
- デフォルトのベンチマーク対象は`src/language-js/utilities/index.js`です
- 通常はcompare.shと組み合わせて使用し、hyperfineで実行時間を計測します
- シリアル実行では各フォーマットを順番に実行し、パラレル実行ではPromise.allSettledで同時実行します
- グループ数とグループサイズを調整することで、ベンチマークの精度と実行時間をコントロールできます
