Ich habe versucht, einen Algorithmus in verschiedenen Sprachen zu erstellen, den ich einmal sehen und vergleichen wollte. Dieses Mal habe ich 10.000 Primzahlen in insgesamt 9 Sprachen berechnet, ausgegeben und die benötigte Zeit angezeigt sah. Von diesen habe ich in der Praxis C, C ++, Java, PHP und JavaScript verwendet (obwohl C und C ++ heutzutage in der Praxis weit voneinander entfernt sind), und ich habe nie einen Übungscode geschrieben (von einer Person geschrieben). Ich habe die Quelle gelesen und in einer anderen Sprache umgeschrieben, aber ich habe Python und C # für eine Weile in meinem persönlichen Lernen berührt. Ruby, Go war das erste Mal, dass ich es berührte.
Wenn Sie die Quelle sehen möchten, lesen Sie bitte GitHub.
Vorerst die Version und die Zeit, die für jede Sprache benötigt werden, sowie ein kurzer Eindruck. Alle verwendeten Maschinen sind übrigens macOS High Sierra.
Apple LLVM version 10.0.0 (clang-1000.10.44.4) ~~ Gesamt: 0,228 Sekunden ~~ Keine Optimierung Berechnungszeit: 0,005386 Sekunden Ausgabezeit: 0,005982 Sekunden Mit Optimierung (O3) Berechnungszeit: 0,003645 Sekunden Ausgabezeit: 0,005690 Sekunden
Die Sprache, die ich beim ersten Programmieren verwendet habe (numerische Berechnungsklasse, als ich Student war). Es ist schnell, aber es gibt viele Einschränkungen und es fühlt sich ein wenig schwierig an, es funktional zu verwenden.
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) ~~ Gesamt: 0,234 Sekunden ~~ Keine Optimierung Berechnungszeit: 0,006875 Sekunden Ausgabezeit: 0,010263 Sekunden Mit Optimierung (O3) Berechnungszeit: 0,003388 Sekunden Ausgabezeit: 0,008505 Sekunden Ich habe es verwendet, als ich in der zweiten Firma war (ich war beim Kunden ansässig und habe die Bildverarbeitung mit OpenCV durchgeführt). Trotzdem habe ich den C ++ - Code zum ersten Mal seit einiger Zeit geschrieben. Es ist schnell, weil es eine Erweiterung der C-Sprache ist. Es wird oft gesagt, dass es sich um eine komplizierte und schwierige Sprache handelt. Wenn Sie jedoch Erfahrung mit C haben und über Kenntnisse der Objektorientierung verfügen, ist die Verwendung einfacher, da sie mehr Funktionen als C hat. Im folgenden Code wird new verwendet, um den Array-Bereich zu sichern, das Löschen erfolgt jedoch durch den Aufrufer.
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 ~~ Gesamt: 0,487 Sekunden ~~ Berechnungszeit: 0,007632128 Sekunden Ausgabezeit: 0,358596283 Sekunden
Ich benutze es in meiner aktuellen Firma. Wenn ich es für geschäftliche Zwecke verwende, verwende ich Eclipse, sodass ich es möglicherweise nicht auf der Konsole kompilieren kann, es sei denn, dies ist der Fall. Eine Sprache, die für verschiedene Zwecke wie das Web, Smartphones und das Einbetten verwendet wird. Ist es ein Nachteil, dass das Starten der VM einige Zeit dauert? Nachtrag 2019/7/7 Wenn ich es so ändere, dass die Berechnungszeit und die Verarbeitungszeit dieses Mal getrennt sind, ist die Ausgabezeit viel länger als die anderen. Warum?
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 ~~ Gesamt: 8,811 Sekunden ~~ Berechnungszeit: 0,160643435 Sekunden Ausgabezeit: 0,037948827 Sekunden Ich benutze es für eine Weile, zum Beispiel um maschinelles Lernen zu studieren, und in meiner Arbeit lese ich Quellen, die von Menschen geschrieben wurden, aber ich schreibe Python selbst selten. Eine umfangreiche Bibliothek mit maschinellem Lernen, numerischen Berechnungen, Statistiken usw. Es war mit Abstand die langsamste der Sprachen, die ich diesmal ausprobiert habe. Gibt es ein Problem beim Schreiben? Auf einem Mac ist Python2 häufig standardmäßig enthalten, sodass der Wechsel zu 3 etwas ärgerlich war. Nachtrag 2019/7/7 Trotz verbesserter Logik ist Python immer noch am langsamsten. Ist es so etwas oder gibt es eine Möglichkeit, es schneller zu machen?
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 ~~ Gesamt: 2,589 Sekunden ~~ Berechnungszeit: 0,058230876922607 Sekunden Ausgabezeit: 0.033617973327637 Sekunden Ich habe es bei der vorherigen Firma benutzt. Es wird meistens nur in der Webentwicklung verwendet und oft mit einem Framework entwickelt (ich benutze normalerweise Laravel). Sie können es frei schreiben, aber seien Sie vorsichtig, da Sie möglicherweise seltsame Gewohnheiten bekommen, wenn Sie nicht vorsichtig sind.
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 ~~ Gesamt: 2,872 Sekunden ~~ Berechnungszeit: 0,07298700 Sekunden Ausgabezeit: 0,0931 1000 Sekunden Ich habe es (immerhin) nie in der Praxis oder im persönlichen Studium benutzt. Dies ist das erste Mal in meinem Leben, dass ich Ruby-Code geschrieben habe. Ruby on Rails ist eine in Japan hergestellte Sprache und berühmt.
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 ~~ Gesamt: 0,261 Sekunden ~~ Berechnungszeit: 0,005 Sekunden Ausgabezeit: 0,092 Sekunden (Der Titel ist markiert, daher kann die Schärfe des Kleinbuchstabens nicht gut angezeigt werden, daher habe ich ihn in Großbuchstaben geschrieben.) Es war überhaupt nicht, aber es war eine Sprache, die ich nicht viel benutzt hatte, und ich hatte die Gelegenheit, sie bei der ersten Firma ein wenig zu berühren. Es wird häufig für die Systementwicklung und Spieleentwicklung unter Windows verwendet, kann jedoch mit Mono auf einem Mac kompiliert werden. Nachtrag 2019/7/7 Ich konnte in C # keine Möglichkeit finden, bis zu Mikrosekunden zu messen. Ich würde es begrüßen, wenn mir jemand sagen könnte.
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 ~~ Gesamt: 0,421 Sekunden ~~ Berechnungszeit: 0,020833395004272462 Sekunden Ausgabezeit: 0,186976930975914 Sekunden Eine Sprache, die für die Front-End-Entwicklung unverzichtbar ist. Frameworks wie Angular, React und Vue.js sind heutzutage sehr beliebt. Anders als auf der Vorderseite können Sie Node.js verwenden, um es zu verschieben.
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 ~~ Gesamt: 0,566 Sekunden ~~ Berechnungszeit: 0,008543 Sekunden Ausgabezeit: 0,060843 Sekunden Ich habe es (immerhin) nie in der Praxis oder im persönlichen Studium benutzt. Dies ist das erste Mal in meinem Leben, dass ich Go-Code schreibe. Eine von Google entwickelte Sprache. Ich kenne die Details nicht, aber es scheint heutzutage beliebt zu sein.
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
}
Wenn man es so betrachtet, ist die Denkweise allen Sprachen gemeinsam, auch wenn der Schreibstil je nach Sprache unterschiedlich ist (kleines Durchschnittsgefühl). Immerhin ist die Programmiersprache interessant. Wenn ich eine Chance habe, möchte ich dasselbe in einer anderen Sprache als der tun, die ich diesmal verwendet habe. Kandidaten sind Kotlin, Swift, Rust, Scala, VB.net.
Nachtrag 2019/7/7 Basierend auf den Empfehlungen im Kommentarbereich haben wir die Berechnungsmethode verbessert und getrennt, da die Zeit für den Berechnungsteil und den Ausgabeteil der Primzahl gleich war. Vielen Dank.
Recommended Posts