Der Flaschenhals ist die CPU und da vor allem die Singlethreadperformance, denn es ist eben längst nicht jede SW auch gut parallelisiert und dazu gehören auch viele Teile von Windows, auch dessen I/O Subsystem. Dort ist meines Wissens vieles gar nicht parallelisiert. Das die Singlethread Performance immer noch so wichtig ist, sieht man nur nicht so leicht beim Blick auf die CPU Auslastung im Task Manager, denn der Taskscheduler von Windows schiebt die SW Threads nämlich viele male pro Sekunde zwischen den Kernen der CPU hin und her und zeigt nur 100% an, wenn alle Kerne (reale und virtuelle bei SMT) voll ausgelastet sind. Wenn als nur ein SW Thread aktiv ist, dann kann der bei Deiner Dualcore CPU maximal 50% Auslastung erzeugen und auch die Ansicht der Auslastung der einzelnen Kerne wird dann nur so etwas über 50% anzeigen. Bei 4 Kernen, egal ob reale oder per SMT virtuelle, sind es nur noch 25%, bei 8 dann 13% und bei noch mehr Kernen fällt die Maximalauslastung durch einen SW Threads dann kaum noch im Grundrauschen der Auslastung durch die ganzen Windowssystemthreads auf.
Dies wissen aber viele Leute nicht und daher fällt ihnen auch gar nicht auf wenn nur ein Thread und damit die Singlethread Perfomance der CPU der Flaschenhals ist. Bei Linux ist dies viel leichter zu erkennen, hier zeigt top 100% Auslastung pro Kern an, wie hier beim 8 Xeon-D meines Heimservers, auf dem ich gerade eine Singlethreadlast laufen lasse:
%Cpu0 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu1 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu2 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu3 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu4 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu5 : 0,0 us, 14,5 sy, 0,0 ni, 85,5 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu6 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu7 : 86,9 us, 11,9 sy, 0,0 ni, 0,0 id, 0,0 wa, 0,0 hi, 1,2 si, 0,0 st
%Cpu8 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu9 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu10 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu11 : 0,0 us, 1,2 sy, 0,0 ni, 98,8 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu12 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu13 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu14 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu15 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Mem : 32675052 total, 254612 free, 3359220 used, 29061220 buff/cache
KiB Swap: 1409020 total, 1409020 free, 0 used. 28490408 avail Mem
Auch verschiebt der Task Scheduler von Linx die Thread sehr nach vielen Sekunden von einem Kern auf den nächsten, wie es hier gerade zu sehen ist:
%Cpu0 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu1 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu2 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu3 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu4 : 0,0 us, 3,0 sy, 0,0 ni, 96,0 id, 1,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu5 : 0,0 us, 10,3 sy, 0,0 ni, 89,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu6 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu7 : 47,2 us, 8,0 sy, 0,0 ni, 42,9 id, 1,0 wa, 0,0 hi, 1,0 si, 0,0 st
%Cpu8 : 35,0 us, 5,3 sy, 0,0 ni, 59,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu9 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu10 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu11 : 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu12 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu13 : 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu14 : 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu15 : 0,0 us, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
Hier sieht man also schön wie ein Thread der SW einen Kern der CPU auslastet, während dies beim Windows Task Manager eben leider kaum erkennbar ist. Benchmarks erzeigen vielleicht voab noch die nicht komprimierbaren Testdaten, fahren dann aber nur I/O Zugriffe und interessieren sich nicht für die Daten die gelesen werden und müssen auch nicht weiter was machen um Daten schreiben zu können. Reale Anwendungen müssen die Daten die sie Lesen aber mehr oder weniger aufwendig verarbeiten, z.B. entpacken, darauf Berechnungen ausführen oder bei Programmcode diesen dann abarbeiten und das alles erfolgt oft nicht parallel. Daher hängt es auch so vom System und der Nutzung ab, wie sehr man von einer schnelleren SSD profitiert!