forked from UNN/2026-rff_mp
Обновление csvwriter
- Функция создания пустого файла - Разобрался с директорией для сохранения файла
This commit is contained in:
parent
6e259a4770
commit
62795e88ba
|
|
@ -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 пишет всё сразу
|
||||||
37
stepushovgs/data-structures/source/results/benchmarks.csv
Normal file
37
stepushovgs/data-structures/source/results/benchmarks.csv
Normal 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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user