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程序仍然会变慢,但可能不会变慢。