以前我在这里问过类似的问题
Android NDK: vector.resize() is too slow, related to allocation?
问题是这段代码
#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
在@Snild Dolkow 的帮助下,我这次成功地将时间缩短到了 4 毫秒
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
我刚刚在我的 CMakeList.txt
文件中添加了这一行
target_compile_options(native-lib PRIVATE
"$<$<CONFIG:RELEASE>:-O3>"
"$<$<CONFIG:DEBUG>:-O3>")
但我意识到无论如何你可以在第二个日志中看到的时间现在是合乎逻辑的......这里发生了一些奇怪的事情。
看一下 - 第一次分配需要 552 微秒,然后将大小调整为 0 需要 0 毫秒(没关系),但最后一次调整大小实际上是调整到与第一次调整大小相同的大小需要 4600 微秒。
这是不可能的,因为 vector 已经被调整大小,当我调用调整大小为 0 时改变的唯一值是内部元素的实际计数,所以再次调用调整大小到它之前的数字意味着只改变计数在 vector 实现中,换句话说,它应该不会超过 0 微秒...
所以,问题是 - 它真的是 ndk 错误吗?或者,我在这里想念什么?
最佳答案
你错过了 std::vector<T>::resize(N, T defaultVal=T{})
将所有 N 值设置为 defaultVal
.如果不指定默认值,则默认为 T{}
.在你的情况下,这是零。
只做分配,不影响值的方法叫做std::vector::reserve(N)
.相关函数是std::vector::capacity()
和 std::vector::shrink_to_fit()
关于android - 为什么即使在优化级别 3 下, vector 分配也需要花费这么多时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377604/