package benchmark
import (
"testing"
)
const rowSize = 10000000
const colSize = 10
var array [rowSize][colSize]int
func BenchmarkColumn(b *testing.B) {
for i := 0; i < b.N; i++ {
sum := 0
for c := 0; c < colSize; c++ {
for r := 0; r < rowSize; r++ {
sum += array[r][c]
}
}
}
}
func BenchmarkRow(b *testing.B) {
for i := 0; i < b.N; i++ {
sum := 0
for r := 0; r < rowSize; r++ {
for c := 0; c < colSize; c++ {
sum += array[r][c]
}
}
}
}
Выше мой код, я использую go test -bench=BenchmarkRow -count=5 && go test -bench=BenchmarkColumn -count=5
➜ benchmark git:(master) ✗ go test -bench=BenchmarkRow -count=5 && go
test -bench=BenchmarkColumn -count=5
goos: darwin
goarch: amd64
pkg: code.byted.org/ttgame/common_packer/benchmark
BenchmarkRow-4 50 36256125 ns/op
BenchmarkRow-4 50 34328959 ns/op
BenchmarkRow-4 50 34073036 ns/op
BenchmarkRow-4 50 33844150 ns/op
BenchmarkRow-4 50 33712912 ns/op
PASS
ok code.byted.org/ttgame/common_packer/benchmark 8.791s
goos: darwin
goarch: amd64
pkg: code.byted.org/ttgame/common_packer/benchmark
BenchmarkColumn-4 50 26131233 ns/op
BenchmarkColumn-4 50 27820932 ns/op
BenchmarkColumn-4 50 26108739 ns/op
BenchmarkColumn-4 50 25956036 ns/op
BenchmarkColumn-4 50 26207859 ns/op
PASS
ok code.byted.org/ttgame/common_packer/benchmark 6.751s
BenchmarkRow быстрее, чем BenchmarkColumn.
Если я изменю rowSize = 100000 && colSize = 100000
, результат будет таким, как показано ниже:
➜ benchmark git:(master) ✗ go test -bench=BenchmarkRow -count=5 && go test -bench=BenchmarkColumn -count=5
goos: darwin
goarch: amd64
pkg: code.byted.org/ttgame/common_packer/benchmark
BenchmarkRow-4 1 2563070975 ns/op
BenchmarkRow-4 1 2641704572 ns/op
BenchmarkRow-4 1 2578772397 ns/op
BenchmarkRow-4 1 2565432939 ns/op
BenchmarkRow-4 1 2597519890 ns/op
PASS
ok code.byted.org/ttgame/common_packer/benchmark 12.953s
goos: darwin
goarch: amd64
pkg: code.byted.org/ttgame/common_packer/benchmark
BenchmarkColumn-4 1 2662919031 ns/op
BenchmarkColumn-4 1 2655671782 ns/op
BenchmarkColumn-4 1 2569661608 ns/op
BenchmarkColumn-4 1 2661993696 ns/op
BenchmarkColumn-4 1 2563400286 ns/op
PASS
ok code.byted.org/ttgame/common_packer/benchmark 13.119s
Кажется, что BenchmarkRow немного быстрее, чем BenchmarkColumn.
По моему мнению, что касается кеш-памяти процессора, BenchmarkRow в любом случае должен быть быстрее, чем BenchmarkColumn.Это выдает мои знания.
Я использую CPP для реализации той же логики.Код:
#include <iostream>
#include <string.h>
#define row_size 10000000
#define col_size 10
int arr[row_size][col_size];
int col();
int row();
int main(int argc, char **argv) {
char *mode = argv[1];
if (strcmp(mode, "col") == 0) {
col();
} else {
row();
}
}
int col() {
std::cout << "col" << std::endl;
int sum = 0;
for (int c = 0; c < col_size; c++) {
for (int r = 0; r < row_size; r++) {
sum += arr[r][c];
}
}
}
int row() {
std::cout << "row" << std::endl;
int sum = 0;
for (int r = 0; r < row_size; r++) {
for (int c = 0; c < col_size; c++) {
sum += arr[r][c];
}
}
}
Скомпилируйте код и запустите его.
benchmark git:(master) ✗ g++ b.cpp -o benchmark && time ./benchmark row && time ./benchmark col
row
./benchmark row 0.26s user 0.04s system 98% cpu 0.303 total
col
./benchmark col 0.26s user 0.04s system 98% cpu 0.312 total
Cpp удовлетворяет мой здравый смысл в отношении кэша процессора, но не работает.
Что делатьGo компилятор и время выполнения делать?
Я пытался запустить мой код на MacOS && Linux.Обе арки это amd64.