J'ai fait un test pour comparer les opérations de la chaîne en plusieurs langues pour le choix d'une langue pour l'application côté serveur. Les résultats semblait normal jusqu'à ce que j'ai finalement essayé C++, ce qui m'a surpris beaucoup. Donc je me demande si je n'avais pas compris tout de l'optimisation et de venir ici pour vous aider.
Le test sont principalement intensive opérations de la chaîne, y compris les concaténer et de la recherche. Le test est effectué sur Ubuntu 11.10 amd64, avec GCC version 4.6.1. La machine est Dell Optiplex 960, avec la 4G de RAM et PROCESSEUR Quad-core.
en Python (2.7.2):
def test():
x = ""
limit = 102 * 1024
while len(x) < limit:
x += "X"
if x.find("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) > 0:
print("Oh my god, this is impossible!")
print("x's length is : %d" % len(x))
test()
ce qui donne le résultat:
x's length is : 104448
real 0m8.799s
user 0m8.769s
sys 0m0.008s
en Java (OpenJDK-7):
public class test {
public static void main(String[] args) {
int x = 0;
int limit = 102 * 1024;
String s="";
for (; s.length() < limit;) {
s += "X";
if (s.indexOf("ABCDEFGHIJKLMNOPQRSTUVWXYZ") > 0)
System.out.printf("Find!\n");
}
System.out.printf("x's length = %d\n", s.length());
}
}
ce qui donne le résultat:
x's length = 104448
real 0m50.436s
user 0m50.431s
sys 0m0.488s
en Javascript (Nodejs 0.6.3)
function test()
{
var x = "";
var limit = 102 * 1024;
while (x.length < limit) {
x += "X";
if (x.indexOf("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) > 0)
console.log("OK");
}
console.log("x's length = " + x.length);
}();
ce qui donne le résultat:
x's length = 104448
real 0m3.115s
user 0m3.084s
sys 0m0.048s
en C++ g++ -Ofast)
Il n'est pas surprenant que Nodejs effectue mieux que Python ou Java. Mais je m'attendais à libstdc++ donnerait une bien meilleure performance que Nodejs, dont le résultat vraiment surpris moi.
#include <iostream>
#include <string>
using namespace std;
void test()
{
int x = 0;
int limit = 102 * 1024;
string s("");
for (; s.size() < limit;) {
s += "X";
if (s.find("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) != string::npos)
cout << "Find!" << endl;
}
cout << "x's length = " << s.size() << endl;
}
int main()
{
test();
}
ce qui donne le résultat:
x length = 104448
real 0m5.905s
user 0m5.900s
sys 0m0.000s
Bref Résumé
OK, maintenant nous allons voir le résumé:
- javascript sur Nodejs(V8): 3.1 s
- Python sur Disponible 2.7.2 : 8,8 s
- C++ avec la bibliothèque libstdc++: 5.9 s
- Java OpenJDK 7: 50.4 s
Étonnamment! J'ai essayé "-O2-O3" en C++, mais en notant aidé. C++ semble qu'environ 50% des performances de javascript V8, et même les pauvres que Disponible. Quelqu'un pourrait-il m'expliquer si j'avais manqué quelques-uns d'optimisation de GCC ou est-ce le cas? Je vous remercie beaucoup.