Почему алокация вектора занимает много времени даже с третим уровнем оптимизации?

205
03 января 2022, 19:10

Я спрашивал подобный вопрос здесь

https://stackoverflow.com/q/58745415/5709159

вот такой код

#include <chrono>
#include <android/log.h>
#include <vector>
while (true)
    {
        const int sz = 2048*2048*3;
        std::vector<unsigned char> v;
        {
            auto startTime = std::chrono::system_clock::now();
            v.resize(sz);
            auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now() - startTime);
            __android_log_print(ANDROID_LOG_ERROR, "READFILE 1", "v.resize(%d) time : %lld\n", sz, duration.count());
        }
        {
            auto startTime = std::chrono::system_clock::now();
            v.resize(0);
            auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now() - startTime);
            __android_log_print(ANDROID_LOG_ERROR, "READFILE 2", "v.resize(0) time : %lld\n", duration.count());
        }
        {
            auto startTime = std::chrono::system_clock::now();
            v.resize(sz);
            auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now() - startTime);
            __android_log_print(ANDROID_LOG_ERROR, "READFILE 3", "v.resize(%d) time : %lld\n", sz, duration.count());
        }
    }

время алокации было около 500 миллисекунд

34.4171: v.resize(12582912) time : 845977
34.9682: v.resize(0) time : 550995
35.5293: v.resize(12582912) time : 561165
36.6121: v.resize(12582912) time : 530845
37.1612: v.resize(0) time : 548528
37.7183: v.resize(12582912) time : 556559
38.7811: v.resize(12582912) time : 515162
39.3312: v.resize(0) time : 550630
39.8883: v.resize(12582912) time : 556319
40.9711: v.resize(12582912) time : 530739
41.5182: v.resize(0) time : 546654
42.0733: v.resize(12582912) time : 554924
43.1321: v.resize(12582912) time : 511659
43.6802: v.resize(0) time : 547084
44.2373: v.resize(12582912) time : 557001
45.3201: v.resize(12582912) time : 530313

Но в итоге проблема оказалась в уровне оптимизации, я добавил несколько строк в CMakeList файл

target_compile_options(native-lib PRIVATE
    "$<$<CONFIG:RELEASE>:-O3>"
    "$<$<CONFIG:DEBUG>:-O3>")

и время снизилось до

E/READFILE 1: v.resize(12582912) time : 573
E/READFILE 2: v.resize(0) time : 0
E/READFILE 3: v.resize(12582912) time : 4683
E/READFILE 1: v.resize(12582912) time : 557
E/READFILE 2: v.resize(0) time : 0
E/READFILE 3: v.resize(12582912) time : 4680
E/READFILE 1: v.resize(12582912) time : 552
E/READFILE 2: v.resize(0) time : 0
E/READFILE 3: v.resize(12582912) time : 4683

Но я потом обратил внимание, что все равно это не логичное время, так как время первой алокации 500, потом resize на 0 занимает 0 (это так и должно быть), но время третьего resize который по своему размеру как и первый занимает 4600...

Это не возможно если знать как это работает внутри, так как единственное, что должно произойти внутири вектора это изменение одной переменной count с 0 на 12582912 (это тот же размер, что и в первом ресайзе), то есть не должно быть никакой алокации...

Вопрос такой - это баг в ndk vector? Или я, что то пропускаю здесь?

P.S я работаю с ndk android

READ ALSO
Вытаскивание текстур из игр на LibGDX

Вытаскивание текстур из игр на LibGDX

Здравствуйте, хотел бы узнать, как вытащить текстуры

235
Перегрузить оператор + в обе стороны

Перегрузить оператор + в обе стороны

Как перегрузить оператор + так, чтобы можно было складывать мой класс с другим типом в обе стороны?

81
Количество знаков после запятой c++

Количество знаков после запятой c++

Нужно вывести результат деления двух чисел с точностью до 10^-9

100
Алгоритмы и структуры данных (задача на c++) [закрыт]

Алгоритмы и структуры данных (задача на c++) [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

219