Professional Documents
Culture Documents
Звіт 1 Фісуненко К25
Звіт 1 Фісуненко К25
ЛАБОРАТОРНА РОБОТА №1
з теми
"Визначення швидкодії обчислювальної системи"
Виконав
студент 1-ого курсу
групи К-16
спеціальності "Інформатика"
Савчук Олександр Юрійович
Київ – 2023
Постановка задачі
Лабораторна робота передбачає розробку спрощеної системи тестів, без
побудови генеральної виборки, опитування експертів, проведення
статистичних вимірювань.
Необхідно розробити програму, яка вимірює кількість виконуваних базових
операцій (команд) за секунду конкретною ОбСист (комп’ютер + ОС +
Система програмування). Вимірювання "чистої" команди процесора не
потрібне (як і є у реальних програмних комплексах, що типово
розробляються на мовах високого рівня, часто навіть на платформенно
незалежних) і фактично не має сенсу.
До базового набору операцій достатньо включити операції додавання,
віднімання, множення та ділення для кожного з базових типів
даних (символьний, варіанти цілого, дійсний тощо, як це є в тій чи тій мові
чи системі програмування). Інші операції, команди та типи – за бажанням.
Наприклад, для С/С++ потрібно взяти типи char, int, long, float та double.
Враховуючи, що для всіх типів процесорів характерне апаратне
об’єднання команди додавання та віднімання у одну команду за рахунок
відповідної зміни знаку одного з операндів (але для зручності кодування на
рівні командного набору ці операції фігурують як окремі команди), не можна
проводити вимірювання лише для однієї з цих двох команд.
Точність вимірювання - 2%. Достатньо на рівні вимірювань для
лабораторної вважати, що для коротких операцій (додавання/віднімання для
цілих слів) кількість операцій приблизно відповідає тактовій частоті
процесора комп’ютера. Від цієї величини беремо 2%, і це значення
буде ±похибка між однойменними результатами для серії запусків програми.
Наприклад, при тактовій частоті у 2 ГГц, 2% дорівнюватиме 40 МГц, або це
приблизно 40 млн. коротких оп./с; отже, похибка між однойменними
результатами ±40 млн. оп./с. Тобто найшвидший результат (наприклад, для
операції додавання) беремо за 100%, а подібна операція (тоді нехай
віднімання) може відстати від додавання на 40 млн. операцій.
Програма має демонструвати стабільність вимірювань для серії запусків.
Потрібно враховувати, що при роботі на платформі MS Windows під час
вимірювання за тестом може початися процес свопінгу системи, тому в
такому випадку сусідні вимірювання у серії можуть відрізнятися на порядок.
Такі запуски потрібно виключати з розгляду.
Результати мають бути представлені у табличній формі з відображенням для
кожного тесту:
1. назви команди/операції,
2. типу/формату даних,
3. кількості операцій за секунду (зайві знаки у мантисі для заданої
точності не відображати),
4. лінійної діаграми значення швидкості у відсотках відносно
найшвидшої команди/операції, яка береться за 100%,
5. значення у відсотках (можна округляти до цілого).
Результати виконання
}
time = ((clock() - time) / CLOCKS_PER_SEC) / op_amount_;
return time;
}
T x;
double time = clock();
for (auto i = 0; i < op_amount_mul; i++)
{
x = a1 * a5;
x = a7 * a3;
x = a4 * a2;
x = a5 * a10;
x = a2 * a6;
x = a8 * a7;
x = a9 * a2;
x = a1 * a3;
x = a10 * a7;
x = a2 * a5;
x = a8 * a4;
x = a9 * a1;
x = a5 * a7;
x = a3 * a2;
x = a1 * a4;
x = a1 * a2;
x = a7 * a5;
x = a5 * a6;
x = a6 * a3;
x = a8 * a2;
x = a6 * a3;
x = a1 * a5;
x = a1 * a3;
x = a5 * a1;
x = a10 * a9;
x = a1 * a8;
x = a5 * a6;
x = a3 * a2;
x = a1 * a4;
x = a7 * a9;
}
time = (clock() - time) / CLOCKS_PER_SEC;
return time;
}
signs[counter] = sign;
types[counter] = type;
cout << signs[counter] <<
" " << types[counter] << " " << setprecision(4) << scientific <<
stod(freqs[counter]) << endl;
counter++;
}
double findMaxFreq()
{
double max = stod(freqs[0]);
for (int i = 1; i < 20; i++)
if (stod(freqs[i]) > max)
max = stod(freqs[i]);
return max;
}
void fillPercents()
{
double maxFreq = findMaxFreq();
for (int i = 0; i < 20; i++)
freqPercents[i] = to_string((int) round((stod(freqs[i]) / maxFreq) * 100));
}
void makeDiagramLines()
{
for (int i = 0; i < 20; i++) {
int amount = stoi(freqPercents[i]);
for (int j = 0; j < amount; j++)
diagramLines[i] += "X";
}
}
int main()
{
SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE), CONSOLE_FULLSCREEN_MODE,
0);
double emptyTime = empty();
double assignmentTime = assignment(emptyTime);
// double dif = emptyTime + 30 * assignmentTime;
testAll("long", 123L, 111L, emptyTime, assignmentTime);
testAll("float", 123.0F, 111.0F, emptyTime, assignmentTime);
testAll("double", 123.0, 111.0, emptyTime, assignmentTime);
testAll("char", '{', 'o', emptyTime, assignmentTime);
testAll("int", 123, 111, emptyTime, assignmentTime);
fillPercents();
makeDiagramLines();
format(types);
format(freqs);
format(diagramLines);
for (int i = 0; i < 20; i++)
cout << signs[i] << "\t" << types[i] << "\t" << setprecision(4) <<
scientific << stod(freqs[i]) << "\t" << freqPercents[i] << "%" << "\t" << diagramLines[i]
<< endl;
return 0;
}