为什么Ruby字符串处理速度很慢?

时间:2013-09-29 03:38:36

标签: c++ ruby-on-rails ruby string time-complexity

示例输入

  

4
  ABCD
  azazaz
  abbzbba
  flkjdh

示例输出

  

4
  21个
  22个
  0

使用C ++编程:

#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程序:

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

当考虑更长的字符串时,Ruby比C ++慢15倍。为什么呢?

1 个答案:

答案 0 :(得分:2)

C ++和Ruby程序不一样。 C ++程序使用char缓冲区进行输入 - 它“循环”内存 - 而Ruby程序使用gets,每次都分配新的内存,这会对性能造成影响。

此外,Ruby程序使用数组来存储答案 - 并且该数组一直在调整大小! C ++使用单个答案变量,它在每次迭代时打印 - 这要快得多。

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