回答

收藏

为什么处理排序数组比处理未排序数组更快?

技术问答 技术问答 606 人阅读 | 0 人回复 | 2023-09-11

这是一段 C   代码显示了一些非常奇怪的行为。出于某种奇怪的原因,对数据进行排序(在定时区域之前)奇迹般地使循环快了近 6 倍。# v; m6 ]2 \4 @# X& b% R: v
[code]#include #include #include <i>int main()()()()()(///)()()()()()(()()()()()())()()(////)())()()()())()()()///////)()()()())())()())()())())()()()()()()()())()()()()()()())()()()())()()()()()()())()()())()()()())()()()()()()()()()()()()//////)/)/)/)()()()()()()()()()()())()())())())()())()())()())()())()())()()())()())()()()()()())()))()))()))()())())())())()()()())()))()))())())()))()()))()()()))()()()))())())()))())()()())())()))())))))())))()()))())))())))()))()())()())()))()))()()()()()))())))))())())()()()()()))))()))())))))()))))()))())()()))))())()()()()()()()())()))()////////)))))))))))))()))))))))()))))))()()()()()()()())))Generate data    const unsigned arraySize =   int data[arraySize];    for (unsigned c = 0; c =         sum  = data[c];         double elapsedTime = static_cast(clock()-start) / CLOCKS_PER_SEC;    std::cout 使用排序数据后,代码运行时间为 1.93 秒。</u>(排序本身比遍历数组需要更多的时间,所以如果我们需要计算未知数组,它实际上不值得这样做。
$ _7 d% y2 @3 R起初,我认为这可能只是一种语言或编译器异常,所以我尝试了 Java:- p% H- y6 j  P/ R( b/ ]
[code]import java.util.Arrays;import java.util.Random;public class Main{    public static void main(String[] args)           Generate data        int arraySize =     int data[] = new int[arraySize];        Random rnd = new Random(0);       for (int c = 0; c =          sum  = data[c];                                               System.out.println((System.nanoTime() - start) / 1000000000.0);System.out.println(&quot;sum = &quot;   sum);  code]结果类似但不那么极端。/ t3 [6 ?9 I$ Z/ k6 G
我的第一个想法是将数据排序到缓存中,但后来我认为这是多么愚蠢,因为数组刚刚生成。1 O8 Q/ s7 Y& j3 U5 N# s; T0 X' x
到底是怎么回事?, V3 v) V5 k# O" M1 p5 r+ t! x0 {
为什么处理排序数组比处理未排序数组快?
代码总结了一些独立的术语,所以顺序应该无关紧要。8 {/ n# I- _  C8 e3 |0 S4 O, J7 L
                                                               
, f' q, ?  y& G/ Y- v    解决方案:                                                               
+ S2 ~( `$ u4 x. v                                                                对于排序数组,条件data[c] >= 128首先false是连续值,然后true是所有的后续值。这很容易预测。您需要支付未排序数组的分支费用。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则