小编Joh*_*nAl的帖子

当95%的情况下的值为0或1时,对非常大的数组进行随机访问的任何优化?

在一个非常大的阵列上是否有任何可能的随机访问优化(我目前使用uint8_t,我问的是什么更好)

uint8_t MyArray[10000000];
Run Code Online (Sandbox Code Playgroud)

当数组中任何位置的值为

  • 95%的情况下为01,
  • 4%的情况下 2 %
  • 在另外1%的情况下,3255之间?

那么,有没有什么比uint8_t用于此的数组更好?它应该尽可能快地以随机顺序循环遍历整个阵列,并且这对RAM带宽非常重,因此当有多个线程同时为不同的阵列执行时,当前整个RAM带宽很快就饱和了.

我问,因为实际上已知除了5%之外几乎所有的值都是0或1时,拥有如此大的数组(10 MB)效率非常低效.因此当数组中所有值的95%时实际上只需要1位而不是8位,这会将内存使用量减少几乎一个数量级.感觉必须有一个更节省内存的解决方案,这将大大减少为此所需的RAM带宽,因此随机访问也会明显更快.

c++ arrays optimization performance memory-bandwidth

132
推荐指数
8
解决办法
1万
查看次数

如何询问有关RAM是在单通道,双通道还是四通道运行的窗口?

如何检测当前的RAM配置?我需要向windows询问RAM当前是在单通道,双通道还是四通道运行.

我搜索了很多,并没有在这个或其他网站上发现任何类似的问题,这对我来说非常令人惊讶.

我正在使用C++,但这个问题确实适用于所有编程语言,因为它是关于什么是windows函数或powershell/ cmd命令将给我我需要的信息.

language-agnostic windows ram wmi

15
推荐指数
1
解决办法
1578
查看次数

编译器在做什么,从而允许通过很少的实际比较就可以完成许多值的比较?

我的问题是,在这种情况下,编译器在做什么,这比我认为的可能更多地优化了代码方式。

鉴于此枚举:

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++ optimization assembly x86-64 micro-optimization

3
推荐指数
2
解决办法
143
查看次数