first commit
This commit is contained in:
234
gobench2.go
Normal file
234
gobench2.go
Normal file
@@ -0,0 +1,234 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand"
|
||||
"os"
|
||||
"runtime"
|
||||
"sort"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Workload functions
|
||||
|
||||
func performIntegerArithmetic(iterations int) {
|
||||
result := 0
|
||||
for i := 0; i < iterations; i++ {
|
||||
result += i * i
|
||||
}
|
||||
_ = result
|
||||
}
|
||||
|
||||
func performFloatingPointArithmetic(iterations int) {
|
||||
result := 0.0
|
||||
for i := 0; i < iterations; i++ {
|
||||
result += math.Sin(float64(i)) * math.Cos(float64(i))
|
||||
}
|
||||
_ = result
|
||||
}
|
||||
|
||||
func performSorting(iterations int) {
|
||||
for i := 0; i < iterations; i++ {
|
||||
data := make([]int, 100)
|
||||
for j := range data {
|
||||
data[j] = rand.Intn(1000)
|
||||
}
|
||||
sort.Ints(data)
|
||||
}
|
||||
}
|
||||
|
||||
func performHashing(iterations int) {
|
||||
data := []byte("initial-hash-data")
|
||||
for i := 0; i < iterations; i++ {
|
||||
hash := sha256.Sum256(data)
|
||||
data = hash[:]
|
||||
}
|
||||
}
|
||||
|
||||
// Compression throughput: Fixed duration
|
||||
func performCompressionThroughput(duration time.Duration) float64 {
|
||||
data := bytes.Repeat([]byte("compress-this-data"), 10) // Data to compress (200 bytes)
|
||||
var buf bytes.Buffer
|
||||
totalBytes := 0
|
||||
start := time.Now()
|
||||
|
||||
for {
|
||||
buf.Reset()
|
||||
writer := gzip.NewWriter(&buf)
|
||||
_, err := writer.Write(data)
|
||||
if err != nil {
|
||||
fmt.Println("Error during compression:", err)
|
||||
return 0
|
||||
}
|
||||
_ = writer.Close()
|
||||
totalBytes += len(data)
|
||||
|
||||
if time.Since(start) >= duration {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
elapsed := time.Since(start).Seconds()
|
||||
return float64(totalBytes) / elapsed // Bytes per second
|
||||
}
|
||||
|
||||
// Benchmarking
|
||||
|
||||
func benchmark(task func(int), iterations int, cores int) float64 {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(cores)
|
||||
start := time.Now()
|
||||
|
||||
for i := 0; i < cores; i++ {
|
||||
go func() {
|
||||
task(iterations / cores)
|
||||
wg.Done()
|
||||
}()
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
duration := time.Since(start).Seconds()
|
||||
return float64(iterations) / duration // Return raw score
|
||||
}
|
||||
|
||||
func humanReadable(score float64, unit string) string {
|
||||
units := []string{"", "K", "M", "G", "T"}
|
||||
i := 0
|
||||
for score >= 1000 && i < len(units)-1 {
|
||||
score /= 1000
|
||||
i++
|
||||
}
|
||||
return fmt.Sprintf("%.2f %s%s", score, units[i], unit)
|
||||
}
|
||||
|
||||
func percentageDiff(current, baseline float64) string {
|
||||
diff := (current - baseline) / baseline * 100
|
||||
return fmt.Sprintf("%+.2f%%", diff)
|
||||
}
|
||||
|
||||
// Encode results into a compact binary format
|
||||
func encodeBaseline(results map[string]float64) string {
|
||||
values := []float64{
|
||||
results["Integer Arithmetic-single"], results["Integer Arithmetic-multi"],
|
||||
results["Floating Point Math-single"], results["Floating Point Math-multi"],
|
||||
results["Sorting-single"], results["Sorting-multi"],
|
||||
results["SHA-256 Hashing-single"], results["SHA-256 Hashing-multi"],
|
||||
results["Compression-single"],
|
||||
}
|
||||
|
||||
buf := new(bytes.Buffer)
|
||||
for _, v := range values {
|
||||
// Scale down to save precision (e.g., fixed point)
|
||||
scaled := int32(v / 1000) // Scale down by 1000
|
||||
binary.Write(buf, binary.LittleEndian, scaled)
|
||||
}
|
||||
return base64.StdEncoding.EncodeToString(buf.Bytes())
|
||||
}
|
||||
|
||||
// Decode a compact binary baseline
|
||||
func decodeBaseline(encoded string) (map[string]float64, error) {
|
||||
data, err := base64.StdEncoding.DecodeString(encoded)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
values := make([]float64, 9)
|
||||
buf := bytes.NewReader(data)
|
||||
for i := 0; i < 9; i++ {
|
||||
var scaled int32
|
||||
err = binary.Read(buf, binary.LittleEndian, &scaled)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
values[i] = float64(scaled) * 1000 // Scale back up
|
||||
}
|
||||
|
||||
return map[string]float64{
|
||||
"Integer Arithmetic-single": values[0], "Integer Arithmetic-multi": values[1],
|
||||
"Floating Point Math-single": values[2], "Floating Point Math-multi": values[3],
|
||||
"Sorting-single": values[4], "Sorting-multi": values[5],
|
||||
"SHA-256 Hashing-single": values[6], "SHA-256 Hashing-multi": values[7],
|
||||
"Compression-single": values[8],
|
||||
}, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
iterations := 1_000_000 // Adjustable workload size
|
||||
cores := runtime.NumCPU()
|
||||
|
||||
workloads := map[string]func(int){
|
||||
"Integer Arithmetic": performIntegerArithmetic,
|
||||
"Floating Point Math": performFloatingPointArithmetic,
|
||||
"Sorting": performSorting,
|
||||
"SHA-256 Hashing": performHashing,
|
||||
}
|
||||
|
||||
// Add compression workload with fixed duration
|
||||
compressionDuration := 3 * time.Second // Fixed duration for compression test
|
||||
fmt.Printf("\nCompression test duration: %s\n", compressionDuration)
|
||||
|
||||
// Baseline comparison setup
|
||||
var baseline map[string]float64
|
||||
if len(os.Args) > 1 {
|
||||
var err error
|
||||
baseline, err = decodeBaseline(os.Args[1])
|
||||
if err != nil {
|
||||
fmt.Println("Error parsing baseline:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// Results storage
|
||||
results := make(map[string]float64)
|
||||
|
||||
fmt.Println("Starting Extended CPU Benchmark...")
|
||||
|
||||
for name, workload := range workloads {
|
||||
fmt.Printf("\nRunning %s benchmark...\n", name)
|
||||
|
||||
// Single-core benchmark
|
||||
fmt.Println("Single-core performance:")
|
||||
singleCoreScore := benchmark(workload, iterations, 1)
|
||||
results[name+"-single"] = singleCoreScore
|
||||
if baseline != nil {
|
||||
fmt.Printf(" Single-core score: %s (%s)\n",
|
||||
humanReadable(singleCoreScore, "ops/sec"),
|
||||
percentageDiff(singleCoreScore, baseline[name+"-single"]))
|
||||
} else {
|
||||
fmt.Printf(" Single-core score: %s\n", humanReadable(singleCoreScore, "ops/sec"))
|
||||
}
|
||||
|
||||
// Multi-core benchmark
|
||||
fmt.Println("Multi-core performance:")
|
||||
multiCoreScore := benchmark(workload, iterations, cores)
|
||||
results[name+"-multi"] = multiCoreScore
|
||||
if baseline != nil {
|
||||
fmt.Printf(" Multi-core score: %s (%s) using %d cores\n",
|
||||
humanReadable(multiCoreScore, "ops/sec"),
|
||||
percentageDiff(multiCoreScore, baseline[name+"-multi"]),
|
||||
cores)
|
||||
} else {
|
||||
fmt.Printf(" Multi-core score: %s using %d cores\n",
|
||||
humanReadable(multiCoreScore, "ops/sec"), cores)
|
||||
}
|
||||
}
|
||||
|
||||
// Compression throughput
|
||||
fmt.Println("\nRunning Compression throughput benchmark...")
|
||||
singleCompressionScore := performCompressionThroughput(compressionDuration)
|
||||
results["Compression-single"] = singleCompressionScore
|
||||
fmt.Printf(" Single-core compression: %s\n", humanReadable(singleCompressionScore, "B/s"))
|
||||
|
||||
// Output compact results for future runs
|
||||
compactResults := encodeBaseline(results)
|
||||
fmt.Printf("\nCompact results for future comparison: %s\n", compactResults)
|
||||
|
||||
fmt.Println("\nExtended CPU Benchmark Completed.")
|
||||
}
|
||||
Reference in New Issue
Block a user