在一个非常大的阵列上是否有任何可能的随机访问优化(我目前使用uint8_t
,我问的是什么更好)
uint8_t MyArray[10000000];
Run Code Online (Sandbox Code Playgroud)
当数组中任何位置的值为
那么,有没有什么比uint8_t
用于此的数组更好?它应该尽可能快地以随机顺序循环遍历整个阵列,并且这对RAM带宽非常重,因此当有多个线程同时为不同的阵列执行时,当前整个RAM带宽很快就饱和了.
我问,因为实际上已知除了5%之外几乎所有的值都是0或1时,拥有如此大的数组(10 MB)效率非常低效.因此当数组中所有值的95%时实际上只需要1位而不是8位,这会将内存使用量减少几乎一个数量级.感觉必须有一个更节省内存的解决方案,这将大大减少为此所需的RAM带宽,因此随机访问也会明显更快.
如何检测当前的RAM配置?我需要向windows询问RAM当前是在单通道,双通道还是四通道运行.
我搜索了很多,并没有在这个或其他网站上发现任何类似的问题,这对我来说非常令人惊讶.
我正在使用C++
,但这个问题确实适用于所有编程语言,因为它是关于什么是windows函数或powershell
/ cmd
命令将给我我需要的信息.
我的问题是,在这种情况下,编译器在做什么,这比我认为的可能更多地优化了代码方式。
鉴于此枚举:
enum MyEnum {
Entry1,
Entry2,
... // Entry3..27 are the same, omitted for size.
Entry28,
Entry29
};
Run Code Online (Sandbox Code Playgroud)
而这个功能:
bool MyFunction(MyEnum e)
{
if (
e == MyEnum::Entry1 ||
e == MyEnum::Entry3 ||
e == MyEnum::Entry8 ||
e == MyEnum::Entry14 ||
e == MyEnum::Entry15 ||
e == MyEnum::Entry18 ||
e == MyEnum::Entry21 ||
e == MyEnum::Entry22 ||
e == MyEnum::Entry25)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
对于该函数,当使用-Ox优化标志(Godbolt)编译时,MSVC会生成此程序集:
bool MyFunction(MyEnum) PROC ; MyFunction
cmp ecx, 24
ja …
Run Code Online (Sandbox Code Playgroud) c++ ×2
optimization ×2
arrays ×1
assembly ×1
performance ×1
ram ×1
windows ×1
wmi ×1
x86-64 ×1