![]() |
1
6
你身上什么都没有 实施 我觉得效率特别低。我承认我不是真的听你的 ,但如果你说这是在你的情况下表现出来的,我会相信你的。
我唯一能想到的是
一些
试试这个:
您不应该承担访问成员的成本,再加上执行边界检查,然后获取数组的值,而应该只承担访问成员的成本。 我对这个问题的答案很感兴趣,所以我建立了一个测试环境。这是我的阵列接口:
当索引超出界限时,此“数组”具有未定义的行为。我总结了明显的实现:
最后,我设计了一个“数组”,其中前10个索引是硬编码成员。通过开关设置/选择成员:
我用这个安全带测试过:
结果有些令人惊讶。TenArray的执行速度比NormalArray快得多(对于size<=10)。减去开销(使用NoOpArray平均值),您得到的TenArray大约占正常数组时间的65%。如果你知道数组的最大值,我想 是 可能超过数组的速度。我可以想象switch比数组使用更少的边界检查或更有效的边界检查。
现在,我不确定您是否能够在实践中获得比数组更快的速度;很明显,这样会导致与接口/类/方法相关联的任何开销。 |
![]() |
2
1
对于这种情况,经验法则是,如果在剖析器下运行时,已知长度的工作的总处理时间增加了2到3倍,那么剖析开销将给您带来扭曲的结果。 要验证您的更改是否确实有影响,请始终衡量性能改进 也是。探查器可以提示您瓶颈,但它也可以欺骗您查看没有问题的地方。 数组边界检查会对性能产生出人意料的巨大影响(如果您做的其他比较少的话),但是它也很难与一般的内存访问惩罚明显分开。在一些琐碎的情况下,JIT可能能够消除它们(Java 6中已经努力消除边界检查),但这主要是AFAIK,仅限于简单的循环构造,如for(x=0;x<array.length;x++)。 在某些情况下,您可以通过简单的成员访问来替换数组访问,从而完全避免绑定检查,但仅限于通过常量索引独占访问数组的少数情况。我看没有办法把它应用到你的问题上。 Mark Peters建议的更改很可能不仅更快,因为它消除了边界检查,而且还因为它以更友好的缓存方式更改了数据结构的局部性属性。 |
![]() |
3
1
许多剖析者告诉你一些非常令人困惑的事情,一部分是因为它们是如何工作的,另一部分是因为人们对性能有有趣的想法。 有一个非常简单的方法来思考这些事情,这使得我们很容易理解发生了什么。
有探查器可以做到这一点。我对Java不太确定。 如果你还和我在一起,让我再扔一个响铃。你在寻找你能优化的东西,对吧?只有那些有足够大的百分比值得你去做的事情,比如10%或者更多?这样一行代码花费10%的时间是在堆栈上的10%。这意味着如果采集了20000个样本,其中大约有2000个样本。如果 平均来说,大约有两个。现在,你在找电话线,对吧?只要你找到,百分之几的折扣真的有关系吗?这是剖析者的另一个快乐神话——时间的精确性很重要。为了找到有价值的问题,20000个样品不会告诉你超过20个样品。 那我该怎么办?手拿样品 研究他们 . 值得优化的代码将直接跳出我。 最后,有一大堆好消息。可能有很多事情你可以优化。假设你解决了一个百分之二十的问题,使它消失。总的时间缩短到原来的4/5,但是其他的问题并没有减少时间,所以现在他们的百分比是原来的5/4,因为分母变小了。百分比 他们变大了 |
![]() |
4
0
您可以尝试使用备忘录或缓存策略来减少实际调用的数量。如果你非常绝望,你可以尝试的另一件事情是本地数组,因为索引这些是难以置信的快,JNI不应该调用太多开销,如果你使用不需要编组的参数如long。 |
![]() |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
![]() |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
![]() |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
![]() |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 3 年前 |
![]() |
Daniel · C#轻松存储快速访问的大型位矩阵 7 年前 |
|
halbe · 优化音频DSP程序的numpy计算 7 年前 |
![]() |
Afsara · 是否有任何方法不能优化我们的应用程序? 7 年前 |