package main //#include import "C" import ( "bytes" "fmt" "math/rand" "time" "unsafe" ) func memcpy(dest, src []byte) int { n := len(src) if len(dest) < len(src) { n = len(dest) } if n == 0 { return 0 } C.memcpy(unsafe.Pointer(&dest[0]), unsafe.Pointer(&src[0]), C.size_t(n)) return n } func genTestData() []byte { var data = make([]byte, 1024*1024*100) count := 0 for { if n, err := rand.Read(data[count:]); err != nil { panic(err) } else { count += n if count >= 1024*1024*100 { break } } } return data } func main() { for i := 0; i < 5; i++ { fmt.Printf("------------第%d次测试----------------\n", i) src := genTestData() var dest1 = make([]byte, len(src)) var dest2 = make([]byte, len(src)) fmt.Println("生成随机测试数据,长度: ", len(src), "开始拷贝:") start1 := time.Now() memcpy(dest1, src) t1 := time.Now().Sub(start1) if bytes.Equal(src, dest1) && &src != &dest1 { fmt.Printf("使用C的memcpy函数: %d(%s)\n", len(dest1), t1) } else { fmt.Println("使用C的memcpy函数: 拷贝异常") } start2 := time.Now() copy(dest2, src) t2 := time.Now().Sub(start2) if bytes.Equal(src, dest2) && &src != &dest2 { fmt.Printf("使用go的copy函数: %d(%s)\n", len(dest2), t2) } else { fmt.Println("使用go的copy函数: 拷贝异常") } } }