Почему создание базовой контрольной суммы путем чтения в 4-байтовый буфер выполняется значительно быстрее, чем при использовании 1-байтового буфера? - PullRequest
0 голосов
/ 23 июня 2019

Я настроил некоторый тестовый код: для чтения файла и создания контрольной суммы из этого файла.

Я создал две функции, одна из которых считывает в 1-байтовый буфер и пересчитываетконтрольная сумма оттуда.Другой считывает 4-байтовый буфер кучи и пересчитывает оттуда контрольную сумму.Еще один читает в 4-байтовый буфер стека и пересчитывает оттуда контрольную сумму.

Было две вещи, которые выделили:

  1. Запускается функция 4-байтового буфера динамической памятипримерно в 828 раз быстрее на моей машине.Я не ожидал такого увеличения производительности.
  2. 4-байтовый буфер стека был примерно в 2 раза быстрее, чем буфер кучи
  3. Они все возвращают одну и ту же контрольную сумму, хотя я бы этого не ожидалкак показано ниже.

Я рассчитал системы, и они и запустили, и выдали это:

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;
}

Ожидаемые результаты:

  1. Две разные контрольные суммы

  2. Значительно меньшее увеличениепо скорости

  3. Буферы Heap и Stack имеют почти одинаковую производительность

Фактические результаты:

  1. Идентичные контрольные суммы

  2. Значительное увеличение скорости

  3. 4-байтовый стековый буфер самый быстрый из всех

Кто-нибудь знает почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...