*System env:*
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:        18.04
Codename:       bionic

$ go version
go version go1.18.3 linux/amd64

$ g++ -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

*Test traversing Go hashmap:*
package main

import (
    "fmt"
    "time"
)

var size = 9999999;

func test_map() {
    m1 := make(map[int]int)
    for i := 0; i < size; i++ {
        m1[i] = i
    }

    sum := 0
    s := time.Now()
    for _, v := range(m1) {
        sum += v
    }
    fmt.Printf("m1  range sum:%v %v\n", sum, time.Since(s))

    sum = 0
    s = time.Now()
    for i := 0; i < size; i++ {
        sum += m1[i]
    }
    fmt.Printf("m1 direct sum:%v %v\n", sum, time.Since(s))
}

func main() {
    test_map()
}

*Test traversing C++ hashmap:*
#include <unordered_map>

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

int size = 9999999;

static uint64_t
gettime() {
    uint64_t t;
    struct timespec ti;
    clock_gettime(CLOCK_MONOTONIC, &ti);
    t = (uint64_t)ti.tv_sec * 1000;
    t += ti.tv_nsec / 1000000;
    return t;
}

void test_hashmap() {
    std::unordered_map<int, int> m1;
        for (int i = 0; i < size; i++) {
        m1[i] = i;
    }

    uint64_t sum = 0;
    uint64_t s = gettime();
    s = gettime();
    for (auto& v : m1) {
        sum += v.second;
    }
    printf("v1 foreach sum:%lu ms:%lu\n", sum, gettime() - s);

    sum = 0;
    s = gettime();
    for (int i = 0; i < size; i++) {
        sum += m1[i];
    }
    printf("v1  direct sum:%lu ms:%lu\n", sum, gettime() - s);
}

int main() {
    test_hashmap();
    return 0;
}

*Compare running result:*
*running Go*
$ go build test.go
$ ./test
m1  range sum:49999985000001 161.385148ms
m1 direct sum:49999985000001 851.517707ms
*running C++*
$ g++ -g -Wall -O2 test.cc
$ ./a.out
v1 foreach sum:49999985000001 ms:31
v1  direct sum:49999985000001 ms:104

*Question:*
Go 161.385148ms vs C++ ms:31 
Go 851.517707ms vs C++ ms:104 
My question is why traversing go map Significantly slowly?
Can it be improved? 

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/67f2994b-5f05-401a-b207-cc730a6f822en%40googlegroups.com.

Reply via email to