代码之家  ›  专栏  ›  技术社区  ›  Tom Gullen

C计算13位而不是本机16位的开销

  •  1
  • Tom Gullen  · 技术社区  · 14 年前

    我正在编译一个查找表,需要 133,784,560 条目,值范围为 0 - 7,462

    最大值 7,462 可以包含在 13 bits . 这给了我们一个大约207MB的查找表。

    16 bit 值增加了我们的查阅表格大小大约 50mb 更多。

    在今天这个年龄段,额外增加的查阅表格的大小并不重要,但是最好尽可能保持它的薄。

    当LUT加载到内存中时,与评估 16 bits ?我假设会有一些中间位操作将其转换为计算机可使用的格式,或者我错了吗?

    每一个时钟周期都很重要,因为这将涉及到一个蛮力分析程序,该程序将运行数十亿次比较。我应该坚持稍微大一点的LUT吗?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Marcelo Cantos    14 年前

    我想这是一个过早优化的例子。比特篡改是相当昂贵的,而且可能会使额外的内存访问成本相形见绌,除非纯粹是巧合,否则您的缓存性能在这两个大小之间的某个地方遇到了瓶颈。

    归根结底,没有什么可以替代仅仅是尝试一下。

        2
  •  4
  •   JaredReisinger    14 年前

    我会坚持使用16位值而不是13位值。由于您正在进行蛮力分析和数十亿次比较,额外的50MB似乎是一个很小的代价。还要记住,管理13位大小写的代码将非常复杂,因为您通常需要读取多个16位(或32位,或其他)值,并进行移位和组合以获得所需的实际值。换句话说,提取价值# n 将比简单地“从表中检索”复杂得多。

    然而,唯一真正能确定的方法是尝试两者并看到…但是,除非您有时间实现13位值检索代码,而您最终可能不会使用这些代码,否则我可能不会费心。

        3
  •  3
  •   tster    14 年前

    我想说试两种方法,看看哪一种更快。此外,我认为这是一个很好的候选人进入C++。你可以把它封装在一个托管C++项目中,你可以直接从C++中引用它。这将允许你做所有你想要的低级优化,同时仍然可以直接访问你的应用程序的其余部分。

        4
  •  2
  •   dan04    14 年前

    当LUT加载到内存中时, 有多少开销需要评估 范围为13位的值, 与评估16位相比?

    假设您的意思是在这样的数组中存储数据:

    AAAAAAAA AAAAABBB BBBBBBBB BBCCCCCC
    CCCCCCCD DDDDDDDD DDDDEEEE EEEEEEEE
    EFFFFFFF FFFFFFGG GGGGGGGG GGGHHHHH
    HHHHHHHH ...
    
    • 计算存储LUT条目的内存地址要复杂得多。你不能像使用编译器那样把2乘以 short[] .
    • 您还可以处理这样一个事实:您的13位值可能被拆分为2个数组元素(如果基础数组是 byte[] )
    • 加上“中间位操作”。