Обновление csvwriter

- Функция создания пустого файла
- Разобрался с директорией для сохранения файла
This commit is contained in:
GordStep 2026-05-13 22:51:35 +03:00
parent 6e259a4770
commit 62795e88ba
4 changed files with 125 additions and 13 deletions

View File

@ -18,7 +18,26 @@ func (b *BenchmarkResult) ToString() string {
return fmt.Sprintf("%s %s %s %f", b.Structure, b.Mode, b.Operation, b.Time) return fmt.Sprintf("%s %s %s %f", b.Structure, b.Mode, b.Operation, b.Time)
} }
func (b *BenchmarkResult) ToStrings() []string { func (b *BenchmarkResult) ToStrings() []string {
return []string{b.Structure, b.Mode, b.Operation, fmt.Sprintf("%d", b.Time)} 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 // AppendRaw дописывает произвольные строки в CSV
@ -26,6 +45,14 @@ func AppendRaw(results []BenchmarkResult) error {
filename := filepath.Join("results", "benchmarks.csv") 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) file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil { if err != nil {
return err return err
@ -35,10 +62,19 @@ func AppendRaw(results []BenchmarkResult) error {
writer := csv.NewWriter(file) writer := csv.NewWriter(file)
defer writer.Flush() 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)) rows := make([][]string, len(results))
for i, res := range results { for i, res := range results {
rows[i] = res.ToStrings() rows[i] = res.ToStrings()
// fmt.Println(res.ToStrings())
} }
return writer.WriteAll(rows) // WriteAll пишет всё сразу return writer.WriteAll(rows) // WriteAll пишет всё сразу

View File

@ -0,0 +1,37 @@
Structure,Mode,Operation,Time
Связный список,Случайный,Вставка,0.047607
Связный список,Случайный,Вставка,0.050350
Связный список,Случайный,Вставка,0.049572
Связный список,Случайный,Вставка,0.049258
Связный список,Случайный,Вставка,0.048659
Связный список,Случайный,Вставка,0.049089
Связный список,Отсортированный,Вставка,0.047619
Связный список,Отсортированный,Вставка,0.047478
Связный список,Отсортированный,Вставка,0.048357
Связный список,Отсортированный,Вставка,0.048174
Связный список,Отсортированный,Вставка,0.048270
Связный список,Отсортированный,Вставка,0.047980
Хеш таблица,Случайный,Вставка,0.002014
Хеш таблица,Случайный,Вставка,0.002013
Хеш таблица,Случайный,Вставка,0.002008
Хеш таблица,Случайный,Вставка,0.001003
Хеш таблица,Случайный,Вставка,0.002505
Хеш таблица,Случайный,Вставка,0.001908
Хеш таблица,Отсортированный,Вставка,0.001514
Хеш таблица,Отсортированный,Вставка,0.001504
Хеш таблица,Отсортированный,Вставка,0.002012
Хеш таблица,Отсортированный,Вставка,0.001003
Хеш таблица,Отсортированный,Вставка,0.002506
Хеш таблица,Отсортированный,Вставка,0.001708
Бинарное дерево поиска,Случайный,Вставка,0.318901
Бинарное дерево поиска,Случайный,Вставка,0.320504
Бинарное дерево поиска,Случайный,Вставка,0.316685
Бинарное дерево поиска,Случайный,Вставка,0.315862
Бинарное дерево поиска,Случайный,Вставка,0.320947
Бинарное дерево поиска,Случайный,Вставка,0.318580
Бинарное дерево поиска,Отсортированный,Вставка,0.313718
Бинарное дерево поиска,Отсортированный,Вставка,0.318131
Бинарное дерево поиска,Отсортированный,Вставка,0.322564
Бинарное дерево поиска,Отсортированный,Вставка,0.315526
Бинарное дерево поиска,Отсортированный,Вставка,0.314289
Бинарное дерево поиска,Отсортированный,Вставка,0.316846
1 Structure Mode Operation Time
2 Связный список Случайный Вставка 0.047607
3 Связный список Случайный Вставка 0.050350
4 Связный список Случайный Вставка 0.049572
5 Связный список Случайный Вставка 0.049258
6 Связный список Случайный Вставка 0.048659
7 Связный список Случайный Вставка 0.049089
8 Связный список Отсортированный Вставка 0.047619
9 Связный список Отсортированный Вставка 0.047478
10 Связный список Отсортированный Вставка 0.048357
11 Связный список Отсортированный Вставка 0.048174
12 Связный список Отсортированный Вставка 0.048270
13 Связный список Отсортированный Вставка 0.047980
14 Хеш таблица Случайный Вставка 0.002014
15 Хеш таблица Случайный Вставка 0.002013
16 Хеш таблица Случайный Вставка 0.002008
17 Хеш таблица Случайный Вставка 0.001003
18 Хеш таблица Случайный Вставка 0.002505
19 Хеш таблица Случайный Вставка 0.001908
20 Хеш таблица Отсортированный Вставка 0.001514
21 Хеш таблица Отсортированный Вставка 0.001504
22 Хеш таблица Отсортированный Вставка 0.002012
23 Хеш таблица Отсортированный Вставка 0.001003
24 Хеш таблица Отсортированный Вставка 0.002506
25 Хеш таблица Отсортированный Вставка 0.001708
26 Бинарное дерево поиска Случайный Вставка 0.318901
27 Бинарное дерево поиска Случайный Вставка 0.320504
28 Бинарное дерево поиска Случайный Вставка 0.316685
29 Бинарное дерево поиска Случайный Вставка 0.315862
30 Бинарное дерево поиска Случайный Вставка 0.320947
31 Бинарное дерево поиска Случайный Вставка 0.318580
32 Бинарное дерево поиска Отсортированный Вставка 0.313718
33 Бинарное дерево поиска Отсортированный Вставка 0.318131
34 Бинарное дерево поиска Отсортированный Вставка 0.322564
35 Бинарное дерево поиска Отсортированный Вставка 0.315526
36 Бинарное дерево поиска Отсортированный Вставка 0.314289
37 Бинарное дерево поиска Отсортированный Вставка 0.316846

View File

@ -38,6 +38,21 @@ type DataStructure interface {
Len() int Len() int
} }
// Создатели структур
type StructureFactory func() DataStructure
func NewLinkedList() DataStructure {
return ll.NewLinkedList()
}
func NewHashTable() DataStructure {
return ht.NewHashTable(256, 0.75)
}
func NewBinSearchTree() DataStructure {
return bst.NewBinSearchTree()
}
func uniqueElements(data []ds.MyData) []ds.MyData { func uniqueElements(data []ds.MyData) []ds.MyData {
res := make([]ds.MyData, 0, len(data)) res := make([]ds.MyData, 0, len(data))
isUnique := true isUnique := true
@ -102,7 +117,7 @@ func testOneInsert(structure DataStructure, data []ds.MyData) float64 {
return time.Since(start).Seconds() return time.Since(start).Seconds()
} }
func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode string) { func TestInsert(factory StructureFactory, data []ds.MyData, nameStruct, mode string) {
BenchRes := make([]csvwriter.BenchmarkResult, 0) BenchRes := make([]csvwriter.BenchmarkResult, 0)
allTestTime := time.Now() allTestTime := time.Now()
@ -111,8 +126,8 @@ func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode stri
// Тест Слчайной вставки // Тест Слчайной вставки
for i := 0; i < countRepeat; i++ { for i := 0; i < countRepeat; i++ {
head := factory()
head := structure
resTime := testOneInsert(head, data) resTime := testOneInsert(head, data)
averageTime += resTime averageTime += resTime
@ -122,6 +137,8 @@ func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode stri
Operation: "Вставка", Operation: "Вставка",
Time: resTime, Time: resTime,
}) })
fmt.Printf("%s | Вставка | %s | Время: %f\n", nameStruct, mode, resTime)
// fmt.Println(BenchRes)
} }
averageTime = time.Since(allTestTime).Seconds() / countRepeat averageTime = time.Since(allTestTime).Seconds() / countRepeat
@ -136,24 +153,27 @@ func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode stri
csvwriter.AppendRaw(BenchRes) csvwriter.AppendRaw(BenchRes)
} }
func Test(nameStruct string, structure DataStructure, data TestData) { func Test(nameStruct string, factory StructureFactory, data TestData) {
// BenchRes := make([]csvwriter.BenchmarkResult, 0) // BenchRes := make([]csvwriter.BenchmarkResult, 0)
// allTestTime := time.Now() // allTestTime := time.Now()
TestInsert(factory, data.Items, nameStruct, "Случайный")
TestInsert(structure, data.Items, nameStruct, "Случайный") TestInsert(factory, data.ItemsSorted, nameStruct, "Отсортированный")
TestInsert(structure, data.ItemsSorted, nameStruct, "Отсортированный")
} }
func main() { func main() {
testData := GenerateTestData() testData := GenerateTestData()
csvwriter.CreateEmptyCSV("results", "benchmarks.csv")
head_ll := &ll.LinkedList{} // head_ll := &ll.LinkedList{}
var head_ht *ht.HashTable = nil // head_ht := ht.NewHashTable(256, 0.75)
var head_bst *bst.BinSearchTree = nil // head_bst := bst.NewBinSearchTree()
Test("Связный список", head_ll, testData) fmt.Println("============= Начало тестов =============")
Test("Хеш таблица", head_ht, testData)
Test("Бинарное дерево поиска", head_bst, testData) Test("Связный список", NewLinkedList, testData)
Test("Хеш таблица", NewHashTable, testData)
Test("Бинарное дерево поиска", NewBinSearchTree, testData)
} }

View File

@ -0,0 +1,19 @@
package main
import (
"fmt"
csvwriter "source/pkg/csv_writer"
)
func main() {
// Простой способ
results := []csvwriter.BenchmarkResult{
{Structure: "HashTable", Mode: "Chaining", Operation: "Insert", Time: 0.001234},
{Structure: "LinkedList", Mode: "Singly", Operation: "Search", Time: 0.005678},
{Structure: "BSTree", Mode: "Recursive", Operation: "Delete", Time: 0.003456},
}
if err := csvwriter.AppendRaw(results); err != nil {
fmt.Printf("Ошибка: %v\n", err)
}
}