Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C计算13位而不是本机16位的开销_C#_Memory Management_Storage_Lookup Tables - Fatal编程技术网

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

C# C计算13位而不是本机16位的开销,c#,memory-management,storage,lookup-tables,C#,Memory Management,Storage,Lookup Tables,我正在编译一个需要133784560个条目的查找表,其值范围为0-7462 7462的最大值可以包含在13位之内。这为我们提供了一个大约207MB的查找表 16位的值会使查找表的大小增加约50mb 在当今时代,查找表大小的额外增加并不显著,但最好保持尽可能的精简 当LUT加载到内存中时,与评估16位相比,评估13位范围的值需要多少开销?我假设会有一些中间位操作将其转换为计算机可用的格式,还是我错了 每个时钟周期都很重要,因为这将涉及到一个暴力分析程序,该程序将运行数十亿次比较。我应该坚持使用稍微

我正在编译一个需要133784560个条目的查找表,其值范围为0-7462

7462的最大值可以包含在13位之内。这为我们提供了一个大约207MB的查找表

16位的值会使查找表的大小增加约50mb

在当今时代,查找表大小的额外增加并不显著,但最好保持尽可能的精简

当LUT加载到内存中时,与评估16位相比,评估13位范围的值需要多少开销?我假设会有一些中间位操作将其转换为计算机可用的格式,还是我错了


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

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

< P>我会说,试着用两种方法,看看哪一个更快。此外,我认为这是一个很好的候选进入C++。您可以将它封装在一个托管C++项目中,您可以直接从C中引用它。这将允许您在您的应用程序的其余部分仍然可以直接访问的情况下,完成所有您想要的低级别优化。

< P>我将使用16位值而不是13位。由于您正在进行暴力分析和数十亿次比较,因此额外的50MB似乎是一个很小的代价。还要记住,管理13位大小写的代码要复杂得多,因为您通常需要读取多个16位或32位或任何值,然后进行移位和组合,以获得所需的实际值。换句话说,提取值n将比简单地从表中检索要复杂得多


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

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


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

我猜这是一种过早优化的情况。位篡改非常昂贵,并且可能会使额外的内存访问成本相形见绌,除非您的缓存性能恰好在这两种大小之间的某个地方


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

我猜这是一个过早优化的例子。位篡改非常昂贵,并且可能会使额外的内存访问成本相形见绌,除非您的缓存性能恰好在这两种大小之间的某个地方

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

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

假设您的意思是将数据存储在如下数组中:

AAAAAAAA AAAAABBB BBBBBBBB BBCCCCCC
CCCCCCCD DDDDDDDD DDDDEEEE EEEEEEEE
EFFFFFFF FFFFFFGG GGGGGGGG GGGHHHHH
HHHHHHHH ...
计算存储LUT项的内存地址更为复杂。您不能像使用short[]那样让编译器乘以2。 您还必须处理这样一个事实:如果基础数组是字节[],则13位的值可能被拆分为2个数组元素或3个数组元素。 加上“中间位操作”。 当LUT加载到内存中时, 有多少开销需要评估 13位范围的值, 与评估16位相比

假设您的意思是将数据存储在如下数组中:

AAAAAAAA AAAAABBB BBBBBBBB BBCCCCCC
CCCCCCCD DDDDDDDD DDDDEEEE EEEEEEEE
EFFFFFFF FFFFFFGG GGGGGGGG GGGHHHHH
HHHHHHHH ...
计算存储LUT项的内存地址更为复杂。您不能像使用short[]那样让编译器乘以2。 您还必须处理这样一个事实:如果基础数组是字节[],则13位的值可能被拆分为2个数组元素或3个数组元素。 加上“中间位操作”。
我一直听到“过早优化”这个词,但不太明白是我
aning,你能详细说明一下吗?另外,这是我第二次尝试同样的问题,我大约在3年前第一次尝试,非常成功,大约5亿次评估/秒,我基本上遵循相同的方法,但如果可能的话,我会尝试寻找更高的性能,因此我认为这是一个合理的问题。@Tom:所谓过早优化,我指的是在瓶颈通过测试经验确定之前进行优化。不要浪费很多宝贵的时间去优化那些不是最慢的事情。当每个时钟周期都计数时,你必须专注于消耗最多时钟的事情。@Tom:任何规模较大的程序都会有性能热点,CPU在代码中花费的时间比例过高。最重要的优化技术之一是首先使用分析工具确定这些热点,然后将所有调优工作集中在这些热点上。术语“过早优化”通常指的是尝试优化您尚未分析的代码的实践,这相当于您的所有代码,这意味着您最终做得很差,即使是在代码中真正需要它的部分(热点)。谢谢您的解释!我一直听到“过早优化”这个词,但我不太明白它的意思,你能详细解释一下吗?另外,这是我第二次尝试解决同一问题,我大约在3年前第一次尝试,非常成功,大约5000万次评估/s,我基本上遵循相同的方法,但如果可能的话,我会尝试寻找更高的性能,因此我认为这是一个合理的问题。@Tom:所谓过早优化,我指的是在瓶颈通过测试经验确定之前进行优化。不要浪费很多宝贵的时间去优化那些不是最慢的事情。当每个时钟周期都计数时,你必须专注于消耗最多时钟的事情。@Tom:任何规模较大的程序都会有性能热点,CPU在代码中花费的时间比例过高。最重要的优化技术之一是首先使用分析工具确定这些热点,然后将所有调优工作集中在这些热点上。术语“过早优化”通常指的是尝试优化您尚未分析的代码的实践,这相当于您的所有代码,这意味着您最终做得很差,即使是在代码中真正需要它的部分(热点)。谢谢您的解释!对于如此大的数据集,可能比位算法更有害的是缓存未命中。您的查询是具有良好的位置性,还是会到处都是?不管怎么说,请描述一下它,看看真正的瓶颈是什么。什么样的数据范围从0到7462?5张扑克牌的不同排名数据集如此之大,可能比位算法更伤害你的是缓存未命中。您的查询是具有良好的位置性,还是会到处都是?不管怎么说,请描述一下它,看看真正的瓶颈是什么。什么样的数据范围在0到7462之间?5张扑克牌的不同排名