J'ai essayé de créer un algorithme dans différentes langues que je voulais voir une fois et de le comparer, cette fois j'ai calculé 10000 nombres premiers dans un total de 9 langues, je l'ai sorti et j'ai affiché le temps nécessaire vu. Parmi ceux-ci, j'ai utilisé C, C ++, Java, PHP et JavaScript dans la pratique (bien que C et C ++ soient très éloignés dans la pratique de nos jours), et je n'ai jamais écrit de code de pratique (écrit par une personne). J'ai lu la source et l'ai réécrit dans un autre langage), mais j'ai touché Python et C # pendant un moment dans mon apprentissage personnel. Ruby, Go était la première fois que je l'ai touché.
Si vous voulez voir la source, veuillez consulter GitHub car ce sera trop long si vous mettez toutes les sources.
Pour le moment, la version et le temps pris pour chaque langue, et une brève impression. Au fait, toutes les machines utilisées sont macOS High Sierra.
Apple LLVM version 10.0.0 (clang-1000.10.44.4) ~~ Total: 0,228 seconde ~~ Aucune optimisation Temps de calcul: 0,005386 secondes Temps de sortie: 0,005982 secondes Avec optimisation (O3) Temps de calcul: 0,003645 secondes Temps de sortie: 0,005690 secondes
La langue que j'ai utilisée lors de ma première programmation (cours de calcul numérique lorsque j'étais étudiant). C'est rapide, mais il y a de nombreuses restrictions et cela semble un peu difficile à utiliser fonctionnellement.
int* generate_primes(int total)
{
int* primes = malloc(sizeof(int) * total);
primes[0] = 2;
int x = 1;
int j = 0;
int k = 1;
while (k < total) {
x += 2;
j = 0;
while (j < k && x % primes[j] != 0) {
if (primes[j] * primes[j] >= x) {
primes[k++] = x;
break;
}
j++;
}
}
return primes;
}
C++ Apple LLVM version 10.0.0 (clang-1000.10.44.4) ~~ Total: 0,234 secondes ~~ Aucune optimisation Temps de calcul: 0,006875 secondes Temps de sortie: 0,010263 secondes Avec optimisation (O3) Temps de calcul: 0,003388 secondes Temps de sortie: 0,008505 secondes J'avais l'habitude de l'utiliser quand j'étais dans la deuxième entreprise (j'étais résidente chez le client et faisais du traitement d'image avec OpenCV). Cela dit, j'ai écrit le code C ++ pour la première fois depuis longtemps. C'est rapide car c'est une extension du langage C. On dit souvent que c'est un langage compliqué et difficile, mais si vous avez de l'expérience avec C et avez une certaine connaissance de l'orientation objet, vous le trouverez plus facile à utiliser car il a plus de fonctions que C. Dans le code ci-dessous, new est utilisé pour sécuriser la zone du tableau, mais la suppression est effectuée par l'appelant.
int* generate_primes(int total)
{
int* primes = new int[total];
primes[0] = 2;
int x = 1;
int k = 1;
while (k < total) {
int j = 0;
x += 2;
while (j < k && x % primes[j] != 0) {
if (primes[j] * primes[j] >= x) {
primes[k++] = x;
break;
}
j++;
}
}
return primes;
}
Java Java 1.8.0_202 ~~ Total: 0,487 secondes ~~ Temps de calcul: 0,007632128 secondes Temps de sortie: 0,358596283 secondes
Je l'utilise dans mon entreprise actuelle. Lorsque je l'utilise pour les affaires, j'utilise Eclipse, donc je ne peux pas le compiler sur la console à moins que ce ne soit le cas. Un langage utilisé à diverses fins telles que le Web, les smartphones et l'intégration. Est-ce un inconvénient que le démarrage de la VM prend un certain temps? PostScript 2019/7/7 Si je le modifie pour que le temps de calcul et le temps de traitement soient séparés cette fois, le temps de sortie est beaucoup plus long que les autres. Pourquoi?
static int[] generatePrimes(int total) {
int primes[] = new int[total];
primes[0] = 2;
int k = 1;
for (int x = 3; k < total; x += 2) {
int i = 0;
while (i < k && x % primes[i] != 0) {
if (primes[i] * primes[i] >= x) {
primes[k++] = x;
break;
}
i++;
}
}
return primes;
}
Python Python 3.7.2 ~~ Total: 8,811 secondes ~~ Temps de calcul: 0,160643435 secondes Temps de sortie: 0,037948827 secondes Je l'utilise depuis un certain temps, par exemple pour étudier l'apprentissage automatique, et dans mon travail, je lis des sources écrites par des gens, mais j'écris rarement Python moi-même. Une riche bibliothèque d'apprentissage automatique, de calculs numériques, de statistiques, etc. C'était de loin la plus lente des langues que j'ai essayées cette fois. Y a-t-il un problème d'écriture? De plus, sur Mac, Python2 est souvent inclus par défaut, donc passer à 3 était un peu ennuyeux. PostScript 2019/7/7 Même avec une logique améliorée, Python est toujours le plus lent. Est-ce quelque chose comme ça, ou y a-t-il un moyen de le rendre plus rapide?
def generate_primes(self, total) :
primes = [0] * total
primes[0] = 2
x = 1
k = 1
while (k < total):
x += 2
j = 0;
while (j < k and x % primes[j] != 0):
if (primes[j] * primes[j] >= x):
primes[k] = x
k = k + 1
break
j = j + 1
return primes
PHP PHP 7.1.23 ~~ Total: 2,589 secondes ~~ Temps de calcul: 0,058230876922607 secondes Temps de sortie: 0,033617973327637 secondes Je l'ai utilisé dans l'entreprise précédente. Il est principalement utilisé uniquement dans le développement Web et est souvent développé à l'aide d'un framework (j'utilise généralement Laravel). Vous pouvez l'écrire librement, mais soyez prudent car vous pourriez avoir des habitudes étranges si vous ne faites pas attention.
public function generate_primes($total) {
$primes = array_fill(0, $total, 0);
$primes[0] = 2;
$x = 1;
$k = 1;
while ($k < $total) {
$x += 2;
$j = 0;
while ($j < $k && $x % $primes[$j] != 0) {
if ($primes[$j] * $primes[$j] >= $x) {
$primes[$k++] = $x;
break;
}
$j++;
}
}
return $primes;
}
Ruby ruby 2.3.7 ~~ Total: 2,872 secondes ~~ Temps de calcul: 0,07298700 secondes Temps de sortie: 0,0931 1000 secondes Je ne l'ai jamais utilisé dans la pratique ou dans l'étude personnelle (après tout). C'est la première fois que j'écris du code Ruby de ma vie. Langue fabriquée au Japon, Ruby on Rails est célèbre.
def generate_primes(total)
$primes = []
$primes[0] = 2
x = 1
k = 1
while (k < total)
x += 2
j = 0
while (j < k && ((x % $primes[j]) != 0))
if ($primes[j] * $primes[j] >= x)
$primes[k] = x
k += 1
break
end
j += 1
end
end
return $primes
end
C# Mono C# compiler version 5.20.1.19 ~~ Total: 0,261 seconde ~~ Temps de calcul: 0,005 secondes Temps de sortie: 0,092 secondes (Le titre est marqué vers le bas, donc la netteté des minuscules ne peut pas être bien affichée, donc je l'ai fait en haut.) Ce n'était pas du tout, mais j'ai eu la chance de le toucher un peu à la première entreprise dans une langue que je n'avais pas beaucoup utilisée. Il est souvent utilisé pour le développement de systèmes et de jeux sous Windows, mais il peut être compilé sur Mac en utilisant Mono. PostScript 2019/7/7 Je n'ai pas pu trouver un moyen de mesurer jusqu'à microsecondes en C #. J'apprécierais que quelqu'un puisse me le dire.
int[] generate_primes(int total)
{
int[] primes = new int[1];
Array.Resize(ref primes, total);
primes[0] = 2;
int x = 1;
int j = 0;
int k = 1;
while (k < total) {
x += 2;
j = 0;
while (j < k && x % primes[j] != 0) {
if (primes[j] * primes[j] >= x) {
primes[k++] = x;
break;
}
j++;
}
}
return primes;
}
JavaScript Node.js v10.15.3 ~~ Total: 0,421 seconde ~~ Temps de calcul: 0,020833395004272462 secondes Temps de sortie: 0,186976930975914 secondes Un langage indispensable pour le développement front-end. Les cadres tels que Angular, React et Vue.js sont populaires de nos jours. Autre que l'avant, vous pouvez utiliser Node.js pour le déplacer.
function generate_primes(n) {
var primes = Array(n);
primes[0] = 2;
var x = 1;
var j = 0;
var k = 1;
while (k < n) {
x += 2;
j = 0;
while (j < k && x % primes[j] != 0) {
if (primes[j] * primes[j] >= x) {
primes[k++] = x;
break;
}
j++;
}
}
return primes;
}
go version go1.12.5 darwin/amd64 ~~ Total: 0,566 seconde ~~ Temps de calcul: 0,008543 secondes Temps de sortie: 0,060843 secondes Je ne l'ai jamais utilisé dans la pratique ou dans l'étude personnelle (après tout). C'est la première fois que j'écris du code Go de ma vie. Un langage développé par Google. Je ne connais pas les détails, mais cela semble être populaire ces jours-ci.
func generate_primes(total int) []int {
var primes [] int
primes = append(primes, 2)
var x, j, k int = 1, 0, 1
for {
if k >= total {
break
}
x += 2
j = 0
for {
if j >= k || x % primes[j] == 0 {
break
}
if primes[j] * primes[j] > x {
k++
primes = append(primes, x)
break
}
j++
}
}
return primes
}
En le regardant de cette manière, même si le style d'écriture est différent selon la langue, la façon de penser est commune à toutes les langues (petit sentiment moyen). Après tout, le langage de programmation est intéressant. Si j'ai une chance, j'aimerais faire la même chose dans une langue autre que celle que j'ai utilisée cette fois. Les candidats sont Kotlin, Swift, Rust, Scala, VB.net.
PostScript 2019/7/7 Sur la base des conseils donnés dans la section commentaire, nous avons amélioré la méthode de calcul et l'avons séparée car le temps de la partie calcul et la partie sortie du nombre premier étaient les mêmes. Merci beaucoup.
Recommended Posts