Почему утечка памяти происходит медленнее, чем удаление [] в динамическом массиве - PullRequest
0 голосов
/ 19 апреля 2019

Я только начал использовать бенчмарк Google для микробенчмаркинга и получил результаты, которые не могу объяснить.У меня есть функция URLify (основные функции, которые кодируют пробелы).Я конвертирую свою строку в char * и передаю ее функции

. Вот так я тестирую ее с помощью бенчмарка Google и полной оптимизации.с использованием VS 2015 x64

while (state.KeepRunning()) {

    char* ch = new char[str.length()*2 ]; //str is a string I want to encode
    memcpy(ch, &str[0], str.length() + 1);  
    URLify(ch, str.length());
    delete[] ch;
}

это результат 30000 итераций и 5 повторений


BenchURLify/iterations:30000/repeats:5                    5370 ns         5729 ns        30000
BenchURLify/iterations:30000/repeats:5                    5366 ns         5208 ns        30000
BenchURLify/iterations:30000/repeats:5                    5349 ns         5208 ns        30000
BenchURLify/iterations:30000/repeats:5                    5364 ns         5729 ns        30000
BenchURLify/iterations:30000/repeats:5                    5356 ns         5208 ns        30000
BenchURLify/iterations:30000/repeats:5_mean               5361 ns         5417 ns            5
BenchURLify/iterations:30000/repeats:5_median             5364 ns         5208 ns            5
BenchURLify/iterations:30000/repeats:5_stddev             8.48 ns          285 ns            5

Но когда я удалил delete [] из кода, бенчмарк Google показал другой результат, а нерезультат я ожидал.Я думал, что освобождение памяти на каждой итерации будет медленнее, чем утечка памяти.Но это результаты без удаления [] ch

BenchURLify/iterations:30000/repeats:5                    7240 ns         7292 ns        30000
BenchURLify/iterations:30000/repeats:5                    7245 ns         7292 ns        30000
BenchURLify/iterations:30000/repeats:5                    7116 ns         7292 ns        30000
BenchURLify/iterations:30000/repeats:5                    7091 ns         7292 ns        30000
BenchURLify/iterations:30000/repeats:5                    7116 ns         6771 ns        30000
BenchURLify/iterations:30000/repeats:5_mean               7162 ns         7188 ns            5
BenchURLify/iterations:30000/repeats:5_median             7116 ns         7292 ns            5
BenchURLify/iterations:30000/repeats:5_stddev             74.6 ns          233 ns            5

Итак, мой вопрос: почему удаление [] показывает лучшую производительность, чем утечка памяти?или что мне здесь не хватает

Ответы [ 2 ]

3 голосов
/ 19 апреля 2019

Функция delete [] работает очень мало и будет очень быстрой.Система, вероятно, будет продолжать возвращать одну и ту же память на каждой итерации, и все это можно сделать в пользовательском пространстве ( что происходит в ядре во время malloc? содержит гораздо больше подробностей).

Выделена памятьк вашему процессу в блоках.Если вы допустите утечку памяти, вам в некоторых случаях потребуется расширить пространство памяти с помощью вызова ядра.Эти вызовы ядра, вероятно, будут намного дороже, чем вызовы удаления.

3 голосов
/ 19 апреля 2019

Есть много возможностей.

  1. Тест некорректен, и время не означает, что вы думаете.
  2. Когда память освобождается, среда выполнения может выделять вам один и тот же блок каждый раз.Но когда не освобождается память, среда выполнения должна выделить новый блок, который может занять время и, возможно, придется выделить больше памяти из ОС (в зависимости от того, как распределение памяти работает в вашей конкретной среде).
  3. Многиебольше.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...