82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
|
|
package csvwriter
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/csv"
|
|||
|
|
"fmt"
|
|||
|
|
"os"
|
|||
|
|
"path/filepath"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type BenchmarkResult struct {
|
|||
|
|
Structure string
|
|||
|
|
Mode string
|
|||
|
|
Operation string
|
|||
|
|
Time float64
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (b *BenchmarkResult) ToString() string {
|
|||
|
|
return fmt.Sprintf("%s %s %s %f", b.Structure, b.Mode, b.Operation, b.Time)
|
|||
|
|
}
|
|||
|
|
func (b *BenchmarkResult) ToStrings() []string {
|
|||
|
|
return []string{b.Structure, b.Mode, b.Operation, fmt.Sprintf("%f", b.Time)}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Создаём пустой csv файл с заголовками
|
|||
|
|
func CreateEmptyCSV(dir, name string) error {
|
|||
|
|
filename := filepath.Join(dir, name)
|
|||
|
|
|
|||
|
|
file, err := os.Create(filename)
|
|||
|
|
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
defer file.Close()
|
|||
|
|
|
|||
|
|
writer := csv.NewWriter(file)
|
|||
|
|
defer writer.Flush()
|
|||
|
|
header := []string{"Structure", "Mode", "Operation", "Time"}
|
|||
|
|
writer.Write(header)
|
|||
|
|
|
|||
|
|
return writer.Error()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AppendRaw дописывает произвольные строки в CSV
|
|||
|
|
func AppendRaw(results []BenchmarkResult) error {
|
|||
|
|
|
|||
|
|
filename := filepath.Join("results", "benchmarks.csv")
|
|||
|
|
|
|||
|
|
fileExists := true
|
|||
|
|
isEmpty := true
|
|||
|
|
if info, err := os.Stat(filename); err == nil {
|
|||
|
|
isEmpty = info.Size() == 0
|
|||
|
|
} else if os.IsNotExist(err) {
|
|||
|
|
fileExists = false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
defer file.Close()
|
|||
|
|
|
|||
|
|
writer := csv.NewWriter(file)
|
|||
|
|
defer writer.Flush()
|
|||
|
|
|
|||
|
|
// Если файл новый или пустой, записываем заголовки
|
|||
|
|
if !fileExists || isEmpty {
|
|||
|
|
header := []string{"Structure", "Mode", "Operation", "Time"}
|
|||
|
|
if err := writer.Write(header); err != nil {
|
|||
|
|
return fmt.Errorf("не удалось записать заголовки: %w", err)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rows := make([][]string, len(results))
|
|||
|
|
|
|||
|
|
for i, res := range results {
|
|||
|
|
rows[i] = res.ToStrings()
|
|||
|
|
// fmt.Println(res.ToStrings())
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return writer.WriteAll(rows) // WriteAll пишет всё сразу
|
|||
|
|
}
|