android - 为什么即使在优化级别 3 下, vector 分配也需要花费这么多时间?

标签 android c++ android-ndk

以前我在这里问过类似的问题

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/

相关文章:

android - boost 信号 : Connect fails

CMake 构建工具链中 "strip"命令的 Android NDK 路径变量

android - View 中的多线程管理?

android - 通知解析错误

java - 如何以编程方式检查 ImageView 的图像资源?

c++ - 在 Qt5 的对象指针上使用 qRegisterMetaType 会引发 Unresolved 错误

android JNI加载mupdf(用NDK编译?)

android - NGUI:如何在实时添加新项目时重置/更新 UIgrid 和 UIScrollBar

c++ - 在 C++ 中使用预定义常量在结构内部进行数组声明

C++ IO 二进制文件流 : default value when output isn't specified