Tôi tình cờ gặp một điều thú vị trong khi kiểm tra hiệu năng cấp phát bộ nhớ trong GO.hiệu suất phân bổ slice golang
package main
import (
"fmt"
"time"
)
func main(){
const alloc int = 65536
now := time.Now()
loop := 50000
for i := 0; i<loop;i++{
sl := make([]byte, alloc)
i += len(sl) * 0
}
elpased := time.Since(now)
fmt.Printf("took %s to allocate %d bytes %d times", elpased, alloc, loop)
}
Tôi đang chạy này trên một Core-i7 2600 với phiên bản đi 1,6 64bit (cũng tương tự kết quả trên 32bit) và 16GB RAM (trên WINDOWS 10) nên khi alloc là 65536 (chính xác 64K) nó chạy trong 30 giây (!!!!). Khi phân bổ là 65535 phải mất ~ 200ms. Ai đó có thể giải thích điều này cho tôi được không? Tôi đã thử cùng một mã ở nhà với lõi i7-920 @ 3.8GHZ nhưng nó không hiển thị kết quả tương tự (cả hai mất khoảng 200ms). Bất cứ ai cũng có một ý tưởng gì đang xảy ra?
Để thêm nhiều biến thể hơn, hãy thử mã của bạn trên Windows 7 (Go 1.6, 64 bit), tôi nhận được 17 giây cho dù 'alloc' là' 65536' hoặc '65535'. – icza
Tôi không phải là một chuyên gia về phân bổ nội bộ, nhưng tôi chỉ muốn đề cập đến việc phân bổ một slice của 65536 byte thực sự phân bổ cộng với 2 số nguyên (các 'len' và' cap' quầy), do đó, thực sự hơn 64KB. – Elwinar
Để thêm thông tin thêm cho vấn đề, tôi chạy mã trên Archlinux của tôi (i7-4720HQ @ 2.60GHz), và phải mất liên tục ~ 600ms. Bạn nên cố gắng sử dụng công cụ lược tả trên thiết lập mất nhiều thời gian. Nó thực sự là một trường hợp tốt để bắt đầu học nó nếu bạn không biết nó đã. – Elwinar