W świecie komputerów, a szczególnie systemów wbudowanych i procesorów pracujących pod kontrolą Linuksa, często spotykamy się z różnymi jednostkami opisującymi wydajność: MIPS, DMIPS czy DMIPS/MHz. Na pierwszy rzut oka wszystkie brzmią podobnie, ale w praktyce oznaczają zupełnie różne rzeczy. Warto wiedzieć, czym się różnią i dlaczego nie można ich bezpośrednio porównywać.

Czym jest MIPS?
MIPS (Million Instructions Per Second) – milion instrukcji na sekundę.
To najstarsza i najprostsza metryka wydajności procesora. Informuje, ile instrukcji CPU może wykonać w ciągu sekundy.
- Zalety: łatwa do zrozumienia i zmierzenia.
- Wady: instrukcja instrukcji nierówna. Różne procesory mają różne zestawy instrukcji (ISA), a te mogą być bardziej lub mniej złożone. Jeden CPU może potrzebować kilku instrukcji do wykonania operacji, którą inny robi jedną. Dlatego porównywanie dwóch różnych architektur tylko na podstawie MIPS jest mylące.
Przykład: procesor A wykonuje 200 MIPS, procesor B tylko 150 MIPS – ale jeśli B ma bardziej złożone instrukcje, może być w praktyce szybszy.
DMIPS – czyli Dhrystone MIPS
Aby uniezależnić pomiar od „prostego liczenia instrukcji”, wprowadzono Dhrystone benchmark – syntetyczny test oparty na typowych operacjach wykonywanych przez programy.
DMIPS (Dhrystone MIPS) to wynik testu Dhrystone przeliczony na ekwiwalent MIPS.
Wzór wygląda tak:
DMIPS = (wynik benchmarku Dhrystone / 1757)
gdzie 1757 to liczba iteracji testu odpowiadająca 1 MIPS na procesorze VAX 11/780 (klasyczny punkt odniesienia z lat 80.).
- Zalety: lepiej odzwierciedla wydajność „rzeczywistą” niż MIPS.
- Wady: nadal jest to benchmark syntetyczny – nie uwzględnia np. wydajności w obliczeniach zmiennoprzecinkowych (floating point) czy wielowątkowości.
DMIPS/MHz – wydajność na takt zegara
Kolejny krok to urealnienie porównania między CPU o różnych częstotliwościach.
Tu pojawia się metryka DMIPS/MHz, która mówi: ile jednostek DMIPS procesor uzyskuje na każdy MHz swojego zegara.
- Jeśli procesor ma 1,2 DMIPS/MHz i taktowanie 500 MHz, jego wydajność teoretyczna wynosi:
1,2 × 500 = 600 DMIPS
- Dzięki temu możemy porównywać różne architektury w sposób bardziej uczciwy, niezależnie od taktowania.
Przykładowe porównanie
- ARM Cortex-M3: ok. 1,25 DMIPS/MHz
- ARM Cortex-A9: ok. 2,5 DMIPS/MHz
- Cortex-A72: nawet powyżej 10 DMIPS/MHz
Jak widać, nowsze architektury są znacznie bardziej wydajne przy tym samym zegarze.
Zróbmy ćwiczenie praktyczne na Linuksie z pomiarów wydajności komputerów!
Na ruszt przychodzą nam dwie architektury, które są pod ręką:
- x86_64
- ARMv7
Oto metodyka zwana Dhrystone Benchmark, która wymaga zainstalowanych pakietów wget i gcc do działania przykładowej implementacji testu. Testy te mierzą wydajność stałoprzecinkowych operacji.
Oto jak zainstalować wymagane pakiety w Linux Debian i Ubuntu:
$ apt install wget gcc
Pobieramy kod skryptu testującego:
$ wget https://homepages.cwi.nl/~steven/dry.c
Uruchomienie i auto-kompilacja:
$ sh dry.c
Wykonajmy kilka testów na architekturze x86_64 (Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz)
$ sh dry.c
cc -c dry.c -o dry1.o
cc -DPASS2 dry.c dry1.o -o dry2
Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register’ attribute
Using times(), HZ=100
Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs:
Microseconds for one run through Dhrystone: 0.05
Dhrystones per Second: 18518518
cc -c -DREG dry.c -o dry1.o
cc -DPASS2 -DREG dry.c dry1.o -o dry2r
Dhrystone Benchmark, Version C, Version 2.2a
Program compiled with 'register’ attribute
Using times(), HZ=100
Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs:
Microseconds for one run through Dhrystone: 0.05
Dhrystones per Second: 21645022
cc -c -O dry.c -o dry1.o
cc -DPASS2 -O dry.c dry1.o -o dry2o
Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register’ attribute
Using times(), HZ=100
Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs: too few
Trying 500000000 runs:
Microseconds for one run through Dhrystone: 0.02
Dhrystones per Second: 40916528
Wykonajmy kilka testów na architekturze ARMv7 (Luckfox Lyra Zero W)
sh dry.c
cc -c dry.c -o dry1.o
cc -DPASS2 dry.c dry1.o -o dry2
Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register' attribute
Using times(), HZ=100
Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs:
Microseconds for one run through Dhrystone: 0.73
Dhrystones per Second: 1377410
cc -c -DREG dry.c -o dry1.o
cc -DPASS2 -DREG dry.c dry1.o -o dry2r
Dhrystone Benchmark, Version C, Version 2.2a
Program compiled with 'register' attribute
Using times(), HZ=100
Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs:
Microseconds for one run through Dhrystone: 0.64
Dhrystones per Second: 1562500
cc -c -O dry.c -o dry1.o
cc -DPASS2 -O dry.c dry1.o -o dry2o
Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register' attribute
Using times(), HZ=100
Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs:
Microseconds for one run through Dhrystone: 0.28
Dhrystones per Second: 3571428
Whetstone – pomaga sprawdzić kalulację zmiennoprzecinkową
Istnieje też inny znany algorytm Whetstone Benchmark stosowany do pomiaru wydajności komputerów z Linuxem.
Wersja kodu performance zaproponowana przez Netlib bez autokalibracji
$ mkdir whetstone
$ cd whetstone
$ wget http://www.netlib.org/benchmark/whetstone.c
$ gcc whetstone.c -o whet -lm
$ ./whet -c 1000000
Wynik przykładowych testów na architekturze x86_64
$ ./whet -c 1000000
Loops: 1000000, Iterations: 1, Duration: 31 sec.
C Converted Double Precision Whetstones: 3225.8 MIPS
Wynik przykładowych testów na architekturze ARMv7
$ ./whet -c 1000000
Loops: 1000000, Iterations: 1, Duration: 219 sec.
C Converted Double Precision Whetstones: 456.6 MIPS
Wersja kodu performance zaproponowana przez Roy Longbottom z autokalibracją
$ mkdir whetstone
$ cd whetstone
$ wget http://www.roylongbottom.org.uk/whets.c
$ gcc -DUNIX whets.c -o whets -lm
$ ./whets
Wynik przykładowych testów na architekturze x86_64
$ ./whets
##########################################
Single Precision C/C++ Whetstone Benchmark
Calibrate
0.01 Seconds 1 Passes (x 100)
0.06 Seconds 5 Passes (x 100)
0.10 Seconds 25 Passes (x 100)
0.31 Seconds 125 Passes (x 100)
1.57 Seconds 625 Passes (x 100)
7.79 Seconds 3125 Passes (x 100)
Use 40117 passes (x 100)
Single Precision C/C++ Whetstone Benchmark
Loop content Result MFLOPS MOPS Seconds
N1 floating point -1.12475013732910156 894.742 0.861
N2 floating point -1.12274742126464844 813.679 6.626
N3 if then else 1.00000000000000000 1422.078 2.920
N4 fixed point 12.00000000000000000 2194.227 5.759
N5 sin,cos etc. 0.49911010265350342 226.600 14.730
N6 floating point 0.99999982118606567 469.947 46.046
N7 assignments 3.00000000000000000 633.781 11.697
N8 exp,sqrt etc. 0.75110864639282227 116.338 12.828
MWIPS 3953.713 101.467
Wynik przykładowych testów na architekturze ARMv7
$ ./whets
##########################################
Single Precision C/C++ Whetstone Benchmark
Calibrate
0.02 Seconds 1 Passes (x 100)
0.11 Seconds 5 Passes (x 100)
^C
root@luckfox:~# ./whets
##########################################
Single Precision C/C++ Whetstone Benchmark
Calibrate
0.02 Seconds 1 Passes (x 100)
0.10 Seconds 5 Passes (x 100)
0.52 Seconds 25 Passes (x 100)
2.61 Seconds 125 Passes (x 100)
Use 4786 passes (x 100)
Single Precision C/C++ Whetstone Benchmark
Loop content Result MFLOPS MOPS Seconds
N1 floating point -1.12475013732910156 267.256 0.344
N2 floating point -1.12274742126464844 132.456 4.856
N3 if then else 1.00000000000000000 163.928 3.022
N4 fixed point 12.00000000000000000 229.596 6.566
N5 sin,cos etc. 0.49911010265350342 17.760 22.420
N6 floating point 0.99999982118606567 74.134 34.823
N7 assignments 3.00000000000000000 53.326 16.586
N8 exp,sqrt etc. 0.75110864639282227 15.648 11.378
MWIPS 478.624 99.995
Tabelka z podsumowaniem testów wydajności mierzonymi różnymi metodami
Jak widać ARMv7 to nowoczesny jednopłytkowy mikrokomputer i jego wydajność w porównaniu z klasycznym (kilkuletnim laptopem na procesorze Intel i7) to różnica pomiędzy 7x … 11x (na korzyść laptopa z i7). Rozrzut wyników w liczbowej skali porównawczej jest naturalny w metrykach wydajności, dlatego warto wykonywać więcej testów i stosować kilka narzędzi, aby ewentualne różnice były czytelne we wnioskach pomiarowych! Dodatkowo pokazany został wycinek test runów, które służyły do zaokrąglenia ostatecznych wyników. Mimo poczynionych starań wyniki na referencyjnej architekturze zawsze będą posiadały różnice kilku procentową, to normalne zjawisko w prowadzeniu pomiarów wydajności złożonych systemów.
Architektura | Komputer | Dhrystones na sekundę | DMIPS = (wynik benchmarku Dhrystone / 1757) | C Converted Double Precision Whetstones: MIPS | MWIPS |
x86_64 | Intel(R) Core(TM) i7-8850H CPU | 40 916 528 | 23 287.72 | 3225.8 | 3 953.713 |
ARMv7 | Luckfox Lyra Zero W | 3 571 428 | 2 032.68 | 456.6 | 478.624 |
Jak to się ma do Linuksa?
W systemach linuksowych, szczególnie w świecie embedded Linux, producenci często podają wydajność swoich SoC w DMIPS lub DMIPS/MHz.
Dzięki temu łatwiej jest programistom ocenić, czy dana platforma sprosta wymaganiom (np. obsługa grafiki, algorytmów kryptograficznych, routera czy analizy danych w czasie rzeczywistym).
Jednocześnie trzeba pamiętać, że:
- MIPS to dziś raczej ciekawostka historyczna.
- DMIPS to uproszczony wskaźnik wydajności, ale nadal nie pokazuje wszystkiego.
- DMIPS/MHz najlepiej nadaje się do porównań międzyarchitektur, ale też ma ograniczenia – nie powie nam nic o wydajności w specyficznych zadaniach, takich jak AI, multimedia czy I/O.
Podsumowanie
- MIPS → liczba instrukcji na sekundę (mało precyzyjne).
- DMIPS → wynik testu Dhrystone, lepsze przybliżenie wydajności ogólnej.
- DMIPS/MHz → stosunek wydajności do częstotliwości, umożliwia porównanie architektur.
Na Linuksie spotkamy te jednostki głównie w dokumentacjach SoC i procesorów wbudowanych. W praktyce, aby realnie ocenić wydajność systemu, najlepiej uruchomić benchmarki odpowiadające naszym zastosowaniom – np. sysbench
, phoronix-test-suite
czy własne testy.
Warto dodać, iż współczesne architektury komputerowe posiadają na pokładzie oprócz CPU również GPU i NPU/TPU, czego powyższy artykuł nie wyczerpuje w temacie dokładnych pomiarów wydajności wszystkich komponentów obliczeniowych. W tym art. skupiamy się wyłącznie na procesorze CPU – taka była intencja tego artykułu!
Dla chętnych – w tym repozytorium znajdziecie różne benchmarki oraz przykładowe zestawienia testów.