Ad „termín ‚funkce‘ zde používám záměrně, protože System.arraycopy() je statická a současně i veřejná metoda, tudíž má blíže ke klasicky pojatým funkcím, než k OOP metodám :-)“
Klidně bych šel ještě dál a nazval to procedurou – protože arraycopy()
nemá návratovou hodnotu a používá vstupně/výstupní parametry.
Je pravda, že Intel tlačil SSE daleko víc a dřív, ale dneska bych větší rozdíly taky nečekal.
Ty výsledky mě docela překvapují. Možná by bylo ještě zajímavé void benchmark7 { copy(src, i, dst, i, length); }, aby se lépe mohlo využít zarovnání.
V Linuxovém kernelu se SSE na kopírování využívá poměrně dost a předpokládám, že to někdo měřil. Takže buď to někdo měřil špatně nebo je špatně implementace v Javě (matně si pamatuju, že v Linux kernel se poměrně dost používá mimojiné prefetch). Taky třeba podotknout, že od přechodu na 64bit se ten rozdíl mezi standardním registrem a SSE trochu snížil...
Tak tady jsou pro zacatel vysledky pro:
Intel(R) Xeon(R) CPU X3220 @ 2.40GHz
java -server -XX:CompileThreshold=10000 -XX:-UseXMMForArrayCopy -XX:-UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 100,708,991 ns
Method ArrayCopyTest2.testArrayCopy2 time: 137,256,239 ns
Method ArrayCopyTest2.testArrayCopy3 time: 121,371,177 ns
Method ArrayCopyTest2.testArrayCopy4 time: 78,153,347 ns
Method ArrayCopyTest2.testArrayCopy5 time: 136,210,011 ns
Method ArrayCopyTest2.testArrayCopy6 time: 121,345,843 ns
java -server -XX:CompileThreshold=10000 -XX:+UseXMMForArrayCopy -XX:-UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 100,502,913 ns
Method ArrayCopyTest2.testArrayCopy2 time: 137,067,723 ns
Method ArrayCopyTest2.testArrayCopy3 time: 121,365,836 ns
Method ArrayCopyTest2.testArrayCopy4 time: 78,151,333 ns
Method ArrayCopyTest2.testArrayCopy5 time: 136,215,355 ns
Method ArrayCopyTest2.testArrayCopy6 time: 121,342,873 ns
java -server -XX:CompileThreshold=10000 -XX:-UseXMMForArrayCopy -XX:+UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 116,575,323 ns
Method ArrayCopyTest2.testArrayCopy2 time: 158,186,271 ns
Method ArrayCopyTest2.testArrayCopy3 time: 159,060,561 ns
Method ArrayCopyTest2.testArrayCopy4 time: 115,436,567 ns
Method ArrayCopyTest2.testArrayCopy5 time: 156,915,770 ns
Method ArrayCopyTest2.testArrayCopy6 time: 158,959,367 ns
java -server -XX:CompileThreshold=10000 -XX:+UseXMMForArrayCopy -XX:+UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 116,566,568 ns
Method ArrayCopyTest2.testArrayCopy2 time: 158,254,976 ns
Method ArrayCopyTest2.testArrayCopy3 time: 159,073,464 ns
Method ArrayCopyTest2.testArrayCopy4 time: 115,399,695 ns
Method ArrayCopyTest2.testArrayCopy5 time: 156,926,495 ns
Method ArrayCopyTest2.testArrayCopy6 time: 158,962,351 ns
Tak a AMDcko, konkretne Quad-Core AMD Opteron(tm) Processor 2350 dava:
java -server -XX:CompileThreshold=10000 -XX:-UseXMMForArrayCopy -XX:-UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 115,435,000 ns
Method ArrayCopyTest2.testArrayCopy2 time: 143,528,000 ns
Method ArrayCopyTest2.testArrayCopy3 time: 125,978,000 ns
Method ArrayCopyTest2.testArrayCopy4 time: 62,768,000 ns
Method ArrayCopyTest2.testArrayCopy5 time: 121,899,000 ns
Method ArrayCopyTest2.testArrayCopy6 time: 120,338,000 ns
java -server -XX:CompileThreshold=10000 -XX:+UseXMMForArrayCopy -XX:-UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 116,356,000 ns
Method ArrayCopyTest2.testArrayCopy2 time: 132,203,000 ns
Method ArrayCopyTest2.testArrayCopy3 time: 126,103,000 ns
Method ArrayCopyTest2.testArrayCopy4 time: 64,035,000 ns
Method ArrayCopyTest2.testArrayCopy5 time: 123,759,000 ns
Method ArrayCopyTest2.testArrayCopy6 time: 122,152,000 ns
java -server -XX:CompileThreshold=10000 -XX:-UseXMMForArrayCopy -XX:+UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 115,771,000 ns
Method ArrayCopyTest2.testArrayCopy2 time: 114,647,000 ns
Method ArrayCopyTest2.testArrayCopy3 time: 128,860,000 ns
Method ArrayCopyTest2.testArrayCopy4 time: 89,716,000 ns
Method ArrayCopyTest2.testArrayCopy5 time: 106,007,000 ns
Method ArrayCopyTest2.testArrayCopy6 time: 125,763,000 ns
java -server -XX:CompileThreshold=10000 -XX:+UseXMMForArrayCopy -XX:+UseUnalignedLoadStores ArrayCopyTest2
Warmup phase...
0 1 2 3 4 5 6 7 8 9 done
Method ArrayCopyTest2.testArrayCopy1 time: 118,603,000 ns
Method ArrayCopyTest2.testArrayCopy2 time: 128,957,000 ns
Method ArrayCopyTest2.testArrayCopy3 time: 135,683,000 ns
Method ArrayCopyTest2.testArrayCopy4 time: 90,829,000 ns
Method ArrayCopyTest2.testArrayCopy5 time: 107,602,000 ns
Method ArrayCopyTest2.testArrayCopy6 time: 127,586,000 ns