Странная производительность в кеше процессора - PullRequest
0 голосов
/ 29 сентября 2019
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...