BogoMips("bogus"=「いんちきの」+ MIPS)とは、Linuxカーネルのブート時にCPU速度をビジーループを使って非科学的に測定した結果である。その定義としてよく言われるのは「プロセッサが全く無駄な処理を1秒間に何百万回できるか」である。

BogoMipsは、あるプロセッサがクロック周波数やキャッシュの有無から見て妥当な性能を示しているかを判断するのに使える。異なる種類のCPU間での性能比較には使えない。

## 歴史

1993年、ラルス・ビルゼニウスが comp.os.linux にLinuxカーネルにBogoMipsが導入された理由を次のように投稿している。

MIPSは Millions of Instructions Per Second(百万命令毎秒)の略だ。プロセッサの速度を求める手段である。そのような測定法の多くと同様、適切に利用されるより乱用されることが多い(異機種のコンピュータ間でMIPS値を正しく比較するのは非常に難しい)。
BogoMipsはリーナス自身の発案である。Linuxカーネル 0.99.11(1993年7月11日)はタイミングループを必要としていた(待ち時間が非常に短いのでループする以外のウェイト手段を採用できなかった)。タイミングループはプロセッサの処理速度の違いを較正しなければならない。そこでカーネルでブート時にビジーループを実際に回してみて、そのコンピュータがどの程度の速度かを測定することにした。"Bogo" は "bogus"(いんちきの)に由来し、それが一種のごまかしであることを意味している。BogoMipsの値はプロセッサ速度の一種の指標を与えるが、あまりにも非科学的なので BogoMips 以外に呼び様がない。
ブート時にその値を表示する理由は2つある。第一にそのコンピュータのキャッシュや加速手段が正しく機能しているかをチェックするのに使える。第二にリーナスはこのニュースを聞いて混乱している人々を見かけたときにくすくす笑うのが大好きである。

## BogoMipsの正しい比較

非常に大まかではあるが、BogoMipsの相対値を計算する式を以下の表で示す。この相対値は各CPUが使用されていた当時のLinuxでのBogoMips値に基づくものである。clock は、そのCPUのクロック周波数。インデックスは、クロック周波数当たりの BogoMips の係数が Intel 386DX と同じCPUを1とした相対値である。

| システム | 相対値 | インデックス |
| --- | --- | --- |
| Intel 8088 | clock × 0.004 | 0.02 |
| Intel/AMD 386SX | clock × 0.14 | 0.8 |
| Intel/AMD 386DX | clock × 0.18 | 1 (これを 1 とした値) |
| Motorola 68030 | clock × 0.25 | 1.4 |
| Cyrix/IBM 486 | clock × 0.34 | 1.8 |
| Intel Pentium | clock × 0.40 | 2.2 |
| Intel486 | clock × 0.50 | 2.8 |
| AMD 5x86 | clock × 0.50 | 2.8 |
| MIPS R4000/R4400 | clock × 0.50 | 2.8 |
| ARM9 | clock × 0.50 | 2.8 |
| Motorola 8081 | clock × 0.65 | 3.6 |
| Motorola 68040 | clock × 0.67 | 3.7 |
| PowerPC 603 | clock × 0.67 | 3.7 |
| Intel StrongARM | clock × 0.66 | 3.7 |
| NexGen Nx586 | clock × 0.75 | 4.2 |
| PowerPC 601 | clock × 0.84 | 4.7 |
| Alpha 21064/21064A | clock × 0.99 | 5.5 |
| Alpha 21066/21066A | clock × 0.99 | 5.5 |
| Alpha 21164/21164A | clock × 0.99 | 5.5 |
| Intel Pentium Pro | clock × 0.99 | 5.5 |
| Cyrix Cx5x86/6x86 | clock × 1.00 | 5.6 |
| Intel Pentium II/III | clock × 1.00 | 5.6 |
| AMD K7/Athlon | clock × 1.00 | 5.6 |
| Intel Celeron | clock × 1.00 | 5.6 |
| Intel Itanium | clock × 1.00 | 5.6 |
| MIPS R4600 | clock × 1.00 | 5.6 |
| Hitachi SH-4 | clock × 1.00 | 5.6 |
| Raspberry Pi (Model B) | clock × 1.00 | 5.6 |
| Intel Itanium 2 | clock × 1.49 | 8.3 |
| Alpha 21264 | clock × 1.99 | 11.1 |
| VIA Centaur | clock × 1.99 | 11.1 |
| AMD K5/K6/K6-2/K6-III | clock × 2.00 | 11.1 |
| AMD Duron/Athlon XP | clock × 2.00 | 11.1 |
| AMD Sempron | clock × 2.00 | 11.1 |
| UltraSparc II | clock × 2.00 | 11.1 |
| Intel Pentium MMX | clock × 2.00 | 11.1 |
| Intel Pentium 4 | clock × 2.00 | 11.1 |
| Intel Pentium M | clock × 2.00 | 11.1 |
| Intel Core Duo | clock × 2.00 | 11.1 |
| Intel Core 2 Duo | clock × 2.00 | 11.1 |
| Intel Atom N455 | clock × 2.00 | 11.1 |
| Centaur C6-2 | clock × 2.00 | 11.1 |
| PowerPC 604/604e/750 | clock × 2.00 | 11.1 |
| Intel Pentium III Coppermine | clock × 2.00 | 11.1 |
| Intel Pentium III Xeon | clock × 2.00 | 11.1 |
| Motorola 68060 | clock × 2.01 | 11.2 |
| Intel Xeon MP (32-bit)(ハイパースレッディング) | clock × 3.97 | 22.1 |
| IBM S390 | データが不十分 |  |
| Intel ARM | データが不十分 |  |

BogoMipsの詳細な情報と数百の測定値が BogoMips Mimi-Howto にある。

Linuxカーネル 2.2.14 以降、キャッシュの設定がBogoMipsの計算前に行われるようになった。BogoMipsの計算方法は変わっていないので、当時の Pentium 系CPU以降ではBogoMips値が約2倍になっている。このBogoMips値の変化は実際のプロセッサ性能には何の効果もない。

## BogoMIPSの計算

Linuxカーネル (2.6.x) での BogoMips は `/usr/src/linux/init/calibrate.c` というソースファイルで実装されている。Linuxカーネルが使用するタイミングパラメータ `loops_per_jiffy` (Jiffy についてはジフィを参照)を計算で求めている。まず、ソースコードのコメントを示す。

`loops_per_jiffy` は`udelay`関数(μ秒単位の遅延)と`ndelay`関数(ナノ秒単位の遅延)の実装で使われている。これらの関数は一部のドライバがハードウェアを待つのに必要としている。これらはビジーウェイトを採用しているので、使用するとカーネルは実質的にブロックされる。i386アーキテクチャの場合 `/usr/src/linux/arch/i386/lib/delay.c` にて `delay_loop` が次のように実装されている。

これをCの擬似コードで書き直すと、次のようになる。

BogoMipsのさらなる詳細と(ほとんどが古いが)数百のBogoMips値が BogoMips mini-Howto にある。