基本情報技術者 2011年 春期 午前(科目A) 問23
問題文
Javaなどのバイトコードプログラムをインタプリタで実行する方法と、コンパイルしてから実行する方法を、次の条件で比較するとき、およそ何行以上のバイトコードであれば、コンパイル方式の方がインタプリタ方式よりも処理時間(コンパイル時間も含む)が短くなるか。
〔条件〕
(1) 実行時間はプログラムの行数に比例する。
(2) 同じ100.行のバイトコードのプログラムをインタプリタで実行すると0.2秒掛かり、コンパイルしてから実行すると0.003秒掛かる。
(3) コンパイル時間は100行当たり0.1秒掛かる。
(4) コンパイル方式の場合は、プログラムの行数に関係なくファイル入出力、コンパイラ起動などのために常に0.15秒のオーバヘッドが掛かる。
(5) プログラムファイルのダウンロード時間など、そのほかの時間は無視して考える。
選択肢
ア:50
イ:75
ウ:125
エ:155(正解)
🔒 解説は解答すると表示されます
バイトコード実行方式の処理時間比較【午前解説】
正解の理由
インタプリタ方式の総時間は行数に比例して増加します。条件から単位当たりの時間を求め、コンパイル方式の総時間と比較すると、コンパイル方式が短くなる境界はおよそ155行です。したがって選択肢の中ではエ(155行)が正解です。正解を明示すると、正解は エ です。
解法ステップ
- 条件から1行あたりの時間を求める。
- インタプリタ:100行で0.2秒 → 1行あたり s。
- コンパイル後の実行:100行で0.003秒 → 1行あたり s。
- コンパイル時間:100行で0.1秒 → 1行あたり s。
- コンパイル方式の総時間式を立てる(行数を とする)。
- 固定オーバーヘッド:s。
- 行に比例する時間:コンパイル時間 と実行時間 。
- よって 。
- インタプリタ方式の総時間式は 。
- 比較して不等式を解く:。
- 変形して → 。
- 「およそ何行以上」なので整数行数に直して 。よって155行以上でコンパイル方式が有利。
選択肢別の誤答解説
- ア: 50 — 根本的に小さすぎます。50行ではインタプリタが明らかに高速です(インタプリタ: s、コンパイル方式: s ≈ s)。
- イ: 75 — 同様に不正解。75行でもインタプリタ優位(インタプリタ: s、コンパイル方式: 約s)。
- ウ: 125 — 近づきますがまだ小さい。125行ではインタプリタ: s、コンパイル方式: 約sでコンパイル方式が遅い。
- エ: 155 — 正解。155行で境界を超え、コンパイル方式が初めて短くなります(計算上 のため 155行以上)。
よくある誤解
- コンパイル時間を固定費だと誤認する:問題ではコンパイル時間は100行当たり0.1秒で行数に比例します(固定は別に0.15秒)。
- 100行あたりの「コンパイルして実行」の0.003秒をコンパイル時間と扱う誤り:これはコンパイル後の実行時間(100行分)であり、コンパイル時間とは別です。
- 切り上げ/切り捨ての扱いミス:境界の算出結果が小数になる場合、問いが「およそ何行以上」なら小数切り上げで整数行数を示す必要があります。
補足コラム
- ブレイクイーブン(損益分岐)行数は「固定オーバーヘッド」を「1行あたりの時間差」で割れば求められます。今回の差は s/行で、固定0.15秒を割ると約154.64行です。
- 実世界ではJITや逐次コンパイル、キャッシュなどで状況が変わりますが、問題は単純化されたモデルで「コンパイル時間を回収できるか」を問う典型問題です。
- 計算確認用に簡単な計算スニペット(参考):
overhead = 0.15
t_interp_per_line = 0.2/100
t_compile_time_per_line = 0.1/100
t_compile_exec_per_line = 0.003/100
n = overhead / (t_interp_per_line - (t_compile_time_per_line + t_compile_exec_per_line))
print(n) # 約154.639...
FAQ
- Q: もし境界がちょうど整数だったらどうする?
A: 「およそ何行以上」であれば、境界の等号を満たす行数も含めて扱います。今回の境界は小数なので切り上げて155行以上です。 - Q: 100行あたりの0.003秒はコンパイル時間に含めないのですか?
A: 含めません。問題文は「コンパイルしてから実行すると0.003秒」としており、これはコンパイル後の実行時間(100行分)です。コンパイル時間は別に0.1秒/100行と明記されています。 - Q: 固定0.15秒の扱いを忘れてしまったら?
A: 固定オーバーヘッドはコンパイル方式の初期負担で、回収するために十分な行数が必要になる点を見落とすと誤答します。
関連キーワード: バイトコード、インタプリタ方式、コンパイル方式、コンパイル時間、オーバーヘッド、ブレイクイーブン行数、実行時間比例、JIT

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

