[RAILS] Tipps zur Geschwindigkeitsverbesserung mit ein wenig Technik

C, C ++ (und andere?) Story

Inkrementieren, Dekrementieren

Allgemeines Schreiben

int i = 1;
i++;

Ein solches Inkrement wird als nachträgliches Inkrement </ b> bezeichnet. Bei Verwendung der for-Anweisung

for(int i = 0;i < 10000;i++){
}

Wie man etwas schneller schreibt

int i = 1;
++i

Ein solches Inkrement wird als Vorinkrement </ b> bezeichnet.

Bei Verwendung der for-Anweisung

for(int i = 0;i < 10000;++i){
}

Ein kleiner Kommentar

Wenn es sich um Nachinkrement </ b> handelt, wird eine Instanz intern erstellt, sodass die Verarbeitung anscheinend einige Zeit in Anspruch nimmt. Aufgrund der Entwicklung des Compilers sind die meisten derzeit jedoch nicht verfügbar. </ Font>

Referenz

Sprechen in C, C ++ und vielen anderen Sprachen

Doppelte Schrift

Allgemeines Schreiben

int num = 100;
int twice = num * 2;

Wie man etwas schneller schreibt

int num = 100;
int twice = num << 1;

Ein kleiner Kommentar

"Bitarithmetik Es wird allgemein gesagt, dass "es schneller ist", aber ich denke, dass es viele Fälle gibt, in denen es schwierig ist zu wissen, wann tatsächlich Bitarithmetik verwendet werden soll. Ist der Fall, der in einem solchen Fall am einfachsten zu verwenden ist, nicht doppelt so hoch wie oben? Auf den ersten Blick ist es jedoch häufig ??? (es verringert die Lesbarkeit), daher ist es möglicherweise besser, die Verwendung in Betracht zu ziehen.

  • Die Rechtsverschiebung (`num >> 1```, half, 1/2) ist eine vorzeichenbehaftete Berechnung (negativer Wert),` num / 2 und `` `num >> Das Ausführungsergebnis kann sich mit 1 ändern.
Referenz

Liste Geschichte

Allgemeines Schreiben

List<int> numList = new List<int>();
for(int i = 0;i < 10000;++i){
  numList.Add(i);
}
if(numList.Contain(9999)){
}

Wie man etwas schneller schreibt

HashSet<int> numList = new HashSet<int>();
for(int i = 0;i < 10000;++i){
  numList.Add(i);
}
if(numList.Contain(9999)){
}

Ein kleiner Kommentar

Wenn Sie ein Array mit variabler Länge wie C # oder Java verwenden, das List (Vektor in C ++) entspricht, und wenn Sie einen Prozess schreiben, um festzustellen, ob ein Wert im Array vorhanden ist, wird der Prozess ausgeführt, der dem folgenden Prozess entspricht. Ich werde.

public bool Contain(int value){
  for(int i = 0;i < this.Count;i++){
    if(this[i] == value){
      return true;
    }
  }
  return false;
}

Wenn diese Liste beispielsweise 10000 Daten enthält, werden diese bis zu 10000 Mal überprüft. (Eine solche Verarbeitung wird als [lineare Suche] bezeichnet (https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E6%8E%A2%E7%B4%A2). Masu) Wenn Sie HashSet oder Dictionary (HashMap usw. in Java) verwenden, können Sie den entsprechenden Wert in einem Prozess erhalten. Daher ist die Geschwindigkeit schneller, da die Beurteilung nur einmal erfolgt. (Diese Art der Verarbeitung wird als [Hash-Suche] bezeichnet (https://programming-place.net/ProgrammingPlacePlus/algorithm/search/006.html). Weitere Informationen finden Sie unter Referenzen.

Referenz

MySQL-Geschichte

last

Allgemeines Schreiben

SELECT id FROM Tabellenname ORDER BY DESC LIMIT 1;

Bei Verwendung der häufig verwendeten Schienen

ActiveRecord.last.id

Wie man super schnell schreibt

SELECT (information_schema.tables.AUTO_INCREMENT - 1) FROM information_schema.tables WHERE information_schema.tables.TABLE_NAME = 'Tabellenname';

Hinweise </ font>

  • Sie können auch die Anzahl der Tabellen (TABLE_ROWS) abrufen, dies ist jedoch ganz anders. → [Ich habe versucht, das Verhältnis der Anzahl der Datensätze der INFORMATION_SCHEMA-TABELLEN-Tabelle von InnoDB und der tatsächlichen Daten zu berechnen. )
  • AUTO_INCREMENT rutscht manchmal aus. Lassen Sie daher einige Auslassungen zu → Beispiel: INSERT ... ON DUPLICATE KEY UPDATE-Syntax ) Kann bei der Verwendung verloren gehen. Daher ist das obige SQL-Ergebnis effektiv, wenn es in einem Fall verwendet wird, in dem es kein Problem gibt, selbst wenn eine Lücke besteht. (Weil es keine Daten gibt, deren Wert mindestens größer als dieser Wert ist)

Ein kleiner Kommentar

Das Ausgeben einer `ORDER BY``` -Anweisung in SQL verlangsamt den Prozess, wenn die Anzahl der Fälle zunimmt, selbst wenn es sich um` LIMIT 1``` handelt. (Grundsätzlich ist der Sortiervorgang schwer) Standardmäßig verfügt MySQL über eine Tabelle, die Metainformationen wie verschiedene Definitionswerte in MySQL aufzeichnet, z. B. Tabelleninformationen mit dem Namen INFORMATION_SCHEMA. Es kann nur aus dieser INFORMATION_SCHEMA-Tabelle gelesen werden, und der Wert kann mithilfe der SELECT-Anweisung abgerufen werden. Die Informationen der Tabelle von INFORMATION_SCHEMA zeichnen auch die Informationen der Anzahl der Fälle (TABLE_ROWS) und die Informationen am Ende (AUTO_INCREMENT) der Tabelle auf. Daher kann es mit hoher Geschwindigkeit ausgeführt werden, indem Informationen aus dieser Tabelle erfasst werden.

  • Vergessen Sie jedoch nicht, dass es einige Einschränkungen gibt.

Andere

Wenn es andere Fälle gibt, in denen die Geschwindigkeit durch einfaches Ändern des Schreibstils verbessert werden kann, möchte ich sie hinzufügen.