From 62795e88ba38db11361db63d1b7a6a1cfb8089cf Mon Sep 17 00:00:00 2001 From: GordStep Date: Wed, 13 May 2026 22:51:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20csvwriter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Функция создания пустого файла - Разобрался с директорией для сохранения файла --- .../csv_writer/{resulter.go => csv_writer.go} | 38 +++++++++++++++- .../source/results/benchmarks.csv | 37 ++++++++++++++++ .../source/tests/benchmark/main.go | 44 ++++++++++++++----- .../source/tests/test_csv_writer/main.go | 19 ++++++++ 4 files changed, 125 insertions(+), 13 deletions(-) rename stepushovgs/data-structures/source/pkg/csv_writer/{resulter.go => csv_writer.go} (50%) create mode 100644 stepushovgs/data-structures/source/results/benchmarks.csv create mode 100644 stepushovgs/data-structures/source/tests/test_csv_writer/main.go diff --git a/stepushovgs/data-structures/source/pkg/csv_writer/resulter.go b/stepushovgs/data-structures/source/pkg/csv_writer/csv_writer.go similarity index 50% rename from stepushovgs/data-structures/source/pkg/csv_writer/resulter.go rename to stepushovgs/data-structures/source/pkg/csv_writer/csv_writer.go index ed67788..713b668 100644 --- a/stepushovgs/data-structures/source/pkg/csv_writer/resulter.go +++ b/stepushovgs/data-structures/source/pkg/csv_writer/csv_writer.go @@ -18,7 +18,26 @@ 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("%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 @@ -26,6 +45,14 @@ 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 @@ -35,10 +62,19 @@ func AppendRaw(results []BenchmarkResult) error { 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 пишет всё сразу diff --git a/stepushovgs/data-structures/source/results/benchmarks.csv b/stepushovgs/data-structures/source/results/benchmarks.csv new file mode 100644 index 0000000..3f611b3 --- /dev/null +++ b/stepushovgs/data-structures/source/results/benchmarks.csv @@ -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 diff --git a/stepushovgs/data-structures/source/tests/benchmark/main.go b/stepushovgs/data-structures/source/tests/benchmark/main.go index 1bc241e..3cd60da 100644 --- a/stepushovgs/data-structures/source/tests/benchmark/main.go +++ b/stepushovgs/data-structures/source/tests/benchmark/main.go @@ -38,6 +38,21 @@ type DataStructure interface { 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 { res := make([]ds.MyData, 0, len(data)) isUnique := true @@ -102,7 +117,7 @@ func testOneInsert(structure DataStructure, data []ds.MyData) float64 { 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) allTestTime := time.Now() @@ -111,8 +126,8 @@ func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode stri // Тест Слчайной вставки for i := 0; i < countRepeat; i++ { + head := factory() - head := structure resTime := testOneInsert(head, data) averageTime += resTime @@ -122,6 +137,8 @@ func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode stri Operation: "Вставка", Time: resTime, }) + fmt.Printf("%s | Вставка | %s | Время: %f\n", nameStruct, mode, resTime) + // fmt.Println(BenchRes) } averageTime = time.Since(allTestTime).Seconds() / countRepeat @@ -136,24 +153,27 @@ func TestInsert(structure DataStructure, data []ds.MyData, nameStruct, mode stri csvwriter.AppendRaw(BenchRes) } -func Test(nameStruct string, structure DataStructure, data TestData) { +func Test(nameStruct string, factory StructureFactory, data TestData) { + // BenchRes := make([]csvwriter.BenchmarkResult, 0) // allTestTime := time.Now() - - TestInsert(structure, data.Items, nameStruct, "Случайный") - TestInsert(structure, data.ItemsSorted, nameStruct, "Отсортированный") + TestInsert(factory, data.Items, nameStruct, "Случайный") + TestInsert(factory, data.ItemsSorted, nameStruct, "Отсортированный") } func main() { testData := GenerateTestData() + csvwriter.CreateEmptyCSV("results", "benchmarks.csv") - head_ll := &ll.LinkedList{} - var head_ht *ht.HashTable = nil - var head_bst *bst.BinSearchTree = nil + // head_ll := &ll.LinkedList{} + // head_ht := ht.NewHashTable(256, 0.75) + // head_bst := bst.NewBinSearchTree() - Test("Связный список", head_ll, testData) - Test("Хеш таблица", head_ht, testData) - Test("Бинарное дерево поиска", head_bst, testData) + fmt.Println("============= Начало тестов =============") + + Test("Связный список", NewLinkedList, testData) + Test("Хеш таблица", NewHashTable, testData) + Test("Бинарное дерево поиска", NewBinSearchTree, testData) } diff --git a/stepushovgs/data-structures/source/tests/test_csv_writer/main.go b/stepushovgs/data-structures/source/tests/test_csv_writer/main.go new file mode 100644 index 0000000..db06963 --- /dev/null +++ b/stepushovgs/data-structures/source/tests/test_csv_writer/main.go @@ -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) + } +}