![]() |
1
5
第二个循环比第一个循环快得多,这并不奇怪。发生的并不是类的速度异常缓慢,而是编译器很容易优化循环。 由于循环的范围是从0到test.length-1,因此编译器可以告诉索引变量永远不能在数组之外,因此它可以在通过索引访问数组时删除范围检查。 在第一个循环中,编译器不能在循环和数组之间进行连接,因此它必须根据访问的每个项的边界检查索引。 在类中封装数组时,总会有一些开销,但这并不像在测试中得到的那样多。您选择了一个编译器能够很好地优化纯数组访问的位置,所以您测试的更多是编译器优化代码的能力,而不是您要测试的内容。 |
![]() |
2
3
您应该在运行代码时对其进行概要分析,并查看花费的时间。 还可以考虑另一种语言,它使使用大整数变得容易。 |
![]() |
3
2
您正在使用整数数据类型来存储一个数字,这是一个真正大数字的一部分?你说什么? 我认为你缺乏对计算机科学的基本理解。 数字0-9可以用4位表示。一个字节包含8位。所以,您可以将两个数字填充到一个字节中(这里有您的第一个加速提示)。 现在,查看一个整数占用了多少字节(提示:它将远远超过存储一个数字所需的字节数)。 杀伤力的是整数的使用,它消耗的内存是你应该消耗的4倍。使用字节或(最坏情况下)字符数组(每个字节或字符2位)来存储数字。将数字“打包”并“解包”成一个字节并不需要很多逻辑。 |
![]() |
4
1
从表面上看,我不希望有什么大的不同。当然不是因素6。BigNumber只是一个围绕
如果你张贴一些小的东西,我们可以复制/粘贴并运行,这将是理想的选择。 |
![]() |
5
1
如果没有看到BigInteger的实现,就很难判断。不过,我有两个猜测。 1)通过数组测试,您的行可以通过JIT获得特殊的处理,从而消除数组边界检查。这可以给你很大的提升,尤其是因为你没有在循环中做任何“真正的工作”
2)您是否在Visual Studio之外的发布模式下对此进行计时?如果不是这样的话,这就解释了6倍的速度下降,因为Visual Studio宿主进程会人为地降低类访问速度。确保您处于释放模式,使用ctrl+f5测试计时。 |
![]() |
6
1
与其重新设计(调试和完善)轮子,不如使用现有的大整数实现更好地为您服务,这样您就可以继续进行项目的其余部分。
This SO topic
是个好的开始。
|
![]() |
7
0
正如Guffa所指出的,差异主要是边界检查。
为了确保边界检查不会破坏性能,您还可以在
|
![]() |
8
0
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |