是否有一种方法来确保数组变量(unsigned int*)将在内存中
Is there a way to make sure an array variable (unsigned int*) will be in memory?
我需要为一个非常大的数组中的所有整体设置一些默认值。它花了我很长时间(110-120毫秒),我怀疑这是因为内存中的失误。
我使用memset/std:fill来设置默认值。是否有一种方法来确保数组将驻留在内存之前的memset/fill?
假设这是一个大的内存映射文件,您可以使用带有MADV_WILLNEED
参数的madvise() libc调用向操作系统暗示您将很快访问提到的区域。
然而,YMMV,由于数组需要足够大,因此产生的系统调用的好处不会被调用的成本所抵消
您可以使用mlock以每页粒度锁定内存,尽管只能锁定固定数量(我不确定OS X上的限制是什么,但您可以使用getrlimit
和RLIMIT_MEMLOCK
来检查它)。
很可能您有一个多核处理器,如果不在单核cpu上使用,memset之类的函数实际上会降低性能。可能是互斥锁导致了速度变慢。尝试在堆栈上分配内存,而不是动态内存。由于它是一个非常大的数组,所以我将尝试制作自己的内存管理器并将其存储在多个线程中(但这只是我在快速阅读一篇文章后产生的想法)。一种标准的方法是为每个线程使用一个内存分配器。无论如何,我都要研究memset以外的东西。
也许下面的文章会有帮助
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 定义 uint= "unsigned int" 没有像我在 Visual Studio 中使用 nvcc 时预期的那样应用
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 正确语法,用于统一初始化名称中带有空格的类型的临时,如unsigned int
- 按值对 std::unordered_map<std:::string, std::atomic<unsigned int>> 进行排序
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 初始化unsigned int至0
- 为什么"unsigned int" + "unsigned int"返回"unsigned int"?
- 对 'WindowProc(HWND__*, unsigned int, unsigned int, long)@16' 的未定义引用
- {app.exe!_com_error::'vector delete destructor'(unsigned int)}
- flann/util/serialization.h class std::unordered_map<unsigned int, std::vector<unsigned int>
- 从'byte* {aka unsigned char*}'到'dword {aka长unsigned int}'失去精度
- unsigned int/signed int/long-long:无法解释的输出
- 对"uint32_t"的暧昧呼唤"long unsigned int"
- 带有unsigned int参数的C++函数在使用negative调用它时会得到奇怪的结果
- 从'uint64_t'转换为'unsigned int'