关于c ++:为什么Ruby字符串处理速度很慢?

Why is Ruby string handling very slow?

样本输入

4
abcd
azazaz
abbzbba
flkjdh

样本输出

4
21
22
0

C++程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define ll long long
char s[1000010];

int main()
{
    int t;
    cin>>t;
    char x;
    scanf("%c",&x);
    while(t--)
    {
        scanf("%s",s);
        int l=-1;
        int len=strlen(&s[0]);
        ll ans=0;

        for(int i=0;s[i]!='\0';i++)
        {
            if(s[i]=='a' || s[i]=='z')
            {
                ans+=((i-l)*(len-i));
                l=i;
            }
        }

        cout<<ans<<endl;
    }
}

Ruby程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
n = gets.chomp.to_i

ans = []

for x in 0..n-1
  str1 = gets.chomp
  l = str1.size
  count = 0
  i = 0
  le = -1

  str1.each_char do |cha|
    if(cha == 'a' || cha == 'z')
      count += (i-le)*(l-i)
      le = i
    end
    i += 1
  end
  ans[x] = count
end

puts ans

当考虑更长的字符串时,露比的速度是C++的15倍。为什么?


C++和Ruby程序是不一样的。C++程序使用一个EDOCX1×0的缓冲区进行输入,它"循环"内存,而Ruby程序使用EDCOX1,1,每次分配新的内存,这对性能造成了影响。

另外,Ruby程序使用一个数组来存储答案——这个数组一直在调整大小!C++使用一个在每次迭代中打印的答案变量,这要快得多。

即使您更改程序以消除这两个差异,Ruby程序仍然会变慢,但可能不会变慢。