Я настроил некоторый тестовый код: для чтения файла и создания контрольной суммы из этого файла.
Я создал две функции, одна из которых считывает в 1-байтовый буфер и пересчитываетконтрольная сумма оттуда.Другой считывает 4-байтовый буфер кучи и пересчитывает оттуда контрольную сумму.Еще один читает в 4-байтовый буфер стека и пересчитывает оттуда контрольную сумму.
Было две вещи, которые выделили:
- Запускается функция 4-байтового буфера динамической памятипримерно в 828 раз быстрее на моей машине.Я не ожидал такого увеличения производительности.
- 4-байтовый буфер стека был примерно в 2 раза быстрее, чем буфер кучи
- Они все возвращают одну и ту же контрольную сумму, хотя я бы этого не ожидалкак показано ниже.
Я рассчитал системы, и они и запустили, и выдали это:
Starting 1-byte buffer checksum
File Checksum: 681168428
Character Loops: 140732754624254
Time Taken: 828 milliseconds // 828816 microseconds
Starting 4-byte buffer checksum
File Checksum: 681168428
Character Loops: 140732754624254
Time Taken: 0 milliseconds // 125 microseconds
Starting 4-byte stacked buffer checksum
File Checksum: 681168428
Character Loops: 140732780154566
Time Taken: 0 milliseconds // 51 microseconds
Это полный исходный код программы, который всерелевантен, так как файл очень маленький:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void runCharacterBufferChecksum(char **argv) {
clock_t startTime;
clock_t endTime;
printf("Starting 1-byte buffer checksum\n");
startTime = clock();
// main code
FILE* ptr_file;
int checksum;
unsigned long characterLoops;
char character;
ptr_file = fopen(argv[1], "r");
while (1) {
character = getc(ptr_file);
if (character == EOF) {
break;
}
checksum += character;
characterLoops++;
}
// end main code
endTime = clock();
printf("File Checksum: %d\n", checksum);
printf("Character Loops: %lu\n", characterLoops);
printf("Time Taken: %lu milliseconds // %lu microseconds\n", (endTime - startTime) / 1000, endTime - startTime);
}
void runIntegerBufferChecksum(char **argv) {
clock_t startTime;
clock_t endTime;
printf("Starting 4-byte buffer checksum\n");
startTime = clock();
// main code
FILE* ptr_file;
int checksum;
unsigned long characterLoops;
char* fourByteBuffer = malloc(4);
ptr_file = fopen(argv[1], "r");
fseek(ptr_file, 0, SEEK_END);
long fileSize = ftell(ptr_file);
rewind(ptr_file);
while (characterLoops <= fileSize / 4) {
fread(fourByteBuffer, sizeof(char), 4, ptr_file);
checksum += (int)fourByteBuffer;
characterLoops++;
}
// end main code
endTime = clock();
printf("File Checksum: %d\n", checksum);
printf("Character Loops: %lu\n", characterLoops);
printf("Time Taken: %lu milliseconds // %lu microseconds\n", (endTime - startTime) / 1000, endTime - startTime);
}
void stackedIntegerBufferChecksum(char **argv) {
clock_t startTime;
clock_t endTime;
printf("Starting 4-byte stacked buffer checksum\n");
startTime = clock();
// main code
FILE* ptr_file;
int checksum;
unsigned long characterLoops;
char fourByteBuffer[4];
ptr_file = fopen(argv[1], "r");
fseek(ptr_file, 0, SEEK_END);
long fileSize = ftell(ptr_file);
rewind(ptr_file);
while (characterLoops <= fileSize / 4) {
fread(fourByteBuffer, sizeof(char), 4, ptr_file);
checksum += (int)fourByteBuffer;
characterLoops++;
}
// end main code
endTime = clock();
printf("File Checksum: %d\n", checksum);
printf("Character Loops: %lu\n", characterLoops);
printf("Time Taken: %lu milliseconds // %lu microseconds\n", (endTime - startTime) / 1000, endTime - startTime);
}
int main(int argc, char* argv[]) {
if (argc == 1) {
printf("Usage: ./main [filename]\n");
return 0;
}
runCharacterBufferChecksum(argv);
printf("\n\n");
runIntegerBufferChecksum(argv);
printf("\n\n");
stackedIntegerBufferChecksum(argv);
return 0;
}
Ожидаемые результаты:
Две разные контрольные суммы
Значительно меньшее увеличениепо скорости
Буферы Heap и Stack имеют почти одинаковую производительность
Фактические результаты:
Идентичные контрольные суммы
Значительное увеличение скорости
4-байтовый стековый буфер самый быстрый из всех
Кто-нибудь знает почему?