为什么JavaScript选择排序挂起

Why JavaScript selection sort hangs

本文关键字:挂起 排序 选择 JavaScript 为什么      更新时间:2023-09-26

我有以下代码:

var longLorem = "..."; // here is a string, > 1 000 000 length
var bufferSize = 1000000;
var lorem = longLorem.substring(0, bufferSize - 1).split('');
var swap; 
var i, j;
for(i=0;i<bufferSize;i++){
    for(j=i+1;j<bufferSize;j++){
    if(lorem[i] > lorem[j]){
        swap = lorem[i];
        lorem[i] = lorem[j];
        lorem[j] = swap;
    }
    }
}

为什么它挂在Chrome下?如何加速JavaScript,或者它不可能像DOM和UI等那样。?

使用bufferSize=100 000,它在2米35秒内完成。

以下C程序在>17m 中完成

#include <stdio.h>
#define bufferSize 1000000
int main( int argc, char *argv[] )
{
   int i,j;
   char swap;
   FILE *loremFile = fopen("lorem.txt", "r");
   char buff[bufferSize];
   fgets(buff, bufferSize, (FILE*)loremFile);
   fclose(loremFile);
   //printf("'%s''n-----END--------'n", buff );
   for(i=0; i<bufferSize-1;i++)
   {
       for(j=i+1;j<bufferSize-1;j++)
       {
           if((int)buff[i] > (int) buff[j])
        {
            swap = (char)buff[i];
            //printf("%c with %c'n", buff[i], buff[j]);
            buff[i] =(char) buff[j];
            buff[j] = swap;
        }
       }
   }
   //buff[bufferSize-1] = ''0';
//   for(i=0;i<bufferSize;i++){
//     printf("%c", buff[i]);
//   }
   printf("'%s''n-----END--------'n", buff);
   printf("exit'n");
   return 0;
}

而C#代码完成了大约10米:

using System;
namespace MySort {
    public class Some {
    public static void Main() {
        int bufferSize = 1000000;
        string loremFile = System.IO.File.ReadAllText("lorem.txt");
        var chars = loremFile.ToCharArray(0, bufferSize);
        for(int i = 0; i<bufferSize; i++) {
        for(int j=i+1; j<bufferSize; j++) {
            if(chars[i] > chars[j]) {
            char swap = chars[i];
            chars[i] = chars[j];
            chars[j] = swap;
            }
        }
        }
        Console.Write("'");
        Console.Write(chars);
        Console.Write("''n");
    }
    }
}

我认为Chrome在长时间操作时有挂起的趋势,有时会崩溃。我在Chrome和Firefox中做过一些事情,Chrome只会崩溃,而Firefox也需要很长时间,但它不会崩溃。我会一直在Firefox上弹出"继续/停止脚本"。

如果你说在c中完成大约需要20分钟,那么我可以想象网络浏览器会花费很长时间(如果不是更长的话),在大多数情况下,浏览器会试图杀死脚本。