Для 2-гої роботи, підтвердьте лінійний час виконання вашої функції перетворення чи обчислення вхідного виразу.
Для того аби підтвердити лінійний час виконання функції PrefixToPostfix робимо бенчмарк, який 20 разів викликає її, заміряючи час виконання.
Відповідно в середину функції передаємо рядок, який збільшується на l рівних фрагментів кожної ітерації.
Аби виміряти час функції запускаємо бенчмарки на одному ядрі процесора, щоб уникнути паралельного обчислення.
Результат наведений нижче.
var str string
var err error
func BenchmarkPrefixToPostfix(b *testing.B) {
l := 0
temp := os.Stdout
for k := 0; k < 20; k++ {
l += 100
expr := strings.Repeat("+ 4 * - 4 2 3 ", l)
b.ResetTimer()
b.Run(fmt.Sprintf("len=%d", l), func(b *testing.B) {
os.Stdout = nil
str, err = PrefixToPostfix(expr)
os.Stdout = temp
})
}
}
Графік по отриманим результатам тільки нагадує пряму, тому що результати бенчмарків залежать від фонових процесів. Вибірка також є не великою, що впливає на "пряму". Однак звідси видно залежність => він наближається до прямої.
*Для 3-тої роботи, побудуйте діаграму взаємодії компонентів у вашій імплементації.
Зображено компоненти Форум, Користувач та Інтереси, а також зв'язок користувача з форумом через інтерес.
Для 4-ої роботи, побудуйте діаграму взаємодії для вашої реалізації (на ній, скоріш за все, мають опинитися компоненти парсера, черги команд, ядра цикла) та підтвердьте лінійний час роботи вашого парсера команд.
Для підтвердження лінійного часу виконання ми зробили бенчмарк який запускає парсер мільйярд разів, вимірюючи час виконання. Як файл для парсингу на кожній ітерації ми створювали текстовий файл команд, збільшуючи кількість команд на певний крок (2000) на кожній ітерації. Окремо винесли змінну, куди зберігаємо результати парсера, щоб наші виклики не були оптимізовані. Бенчмарки запускалися на одному ядрі процесора, щоб точно вимірятии час виконання та уникнути проблем з доступом до файлу. Збільшуючи на однакову кількість однакових команд наш файл ми зможемо простежити настільки більше часу потрібно парсеру для обробки файлу. Ми повинні довести що цей час є лінійним, тож зробимо 20 ітерацій та побудуємо графік за знайденими точками. Навіть виконуючи подібні бенчмарки в лабараторних умовах, в нас все ж працює операційна система й існує купа фонових процесів що так чи інакше впливають на час виконання, тож графік не може бути абсолютно лінійним, але він повинен бути паближено схожий.
var cmds []engine.Command
func BenchmarkParser(b *testing.B) {
l := 0
for k := 0; k < 20; k++ {
l += 2000
f, _ := os.Create("test.txt")
for j := 0; j < l; j++ {
f.WriteString("print тутВсеОкВиводьМене\nreverse FaineMisto\n")
}
b.ResetTimer()
b.Run(fmt.Sprintf("len=%d", l), func(b *testing.B) {
cmds = parser.Parse("test.txt")
})
}
}
Другою частиною завдання було створити діаграму взаємодії, де ми визначили ключові сутності нашої системи та яким чином вони взаємодіють між собою. В даному випадку ми виокремили також 2 інтерфейси це Handler та Command.