Heim > Backend-Entwicklung > C++ > Was sind die schnellsten Methoden zum Parsen von durch Leerzeichen getrennten Gleitkommazahlen in C?

Was sind die schnellsten Methoden zum Parsen von durch Leerzeichen getrennten Gleitkommazahlen in C?

Barbara Streisand
Freigeben: 2024-12-03 10:19:11
Original
518 Leute haben es durchsucht

What are the Fastest Methods for Parsing Space-Separated Floats in C  ?

So analysieren Sie durch Leerzeichen getrennte Floats in C schnell

Das Parsen von durch Leerzeichen getrennten Floats kann eine zeitaufwändige Aufgabe sein, insbesondere wenn Sie mit großen Dateien arbeiten. Herkömmliche Methoden wie die Verwendung von Standard-C-Streams können langsam sein. In diesem Artikel werden mehrere effiziente Methoden zum Parsen von Floats in C untersucht.

Boost Spirit

Boost Spirit ist eine leistungsstarke C-Bibliothek, die erweiterte Parsing-Funktionen bietet. Trotz seiner anfänglichen Lernkurve bietet Spirit eine schnelle und zuverlässige Analyse. So verwenden Sie es:

#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

int main() {
  std::string line = "134.32 3545.87 3425";

  double x, y, z;
  auto it = line.begin();
  bool success = qi::phrase_parse(it, line.end(), qi::double_ >> qi::double_ >> qi::double_, qi::blank, data);

  if (success) {
    std::cout << "Parsed values: " << x << " " << y << " " << z << std::endl;
  }

  return 0;
}
Nach dem Login kopieren

Speicherzugeordnete Dateien

Speicherzugeordnete Dateien bieten eine schnellere Möglichkeit, Dateien ohne den Mehraufwand herkömmlicher E/A-Vorgänge in den Speicher einzulesen. Dies kann das Parsen erheblich beschleunigen:

#include <iostream>
#include <fstream>
#include <sys/stat.h>
#include <sys/mman.h>

int main() {
  std::ifstream file("data.txt");
  struct stat statbuf;
  fstat(file.fileno(), &statbuf);

  // Memory-map the file
  char* data = static_cast<char*>(mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, file.fileno(), 0));

  // Iterate through the data to parse floats
  for (char* ptr = data; ptr < data + statbuf.st_size;) {
    double x, y, z;
    ptr = std::sscanf(ptr, "%f %f %f", &x, &y, &z);
    // Parse the float values and perform desired operations
  }

  // Unmap the file
  munmap(data, statbuf.st_size);

  return 0;
}
Nach dem Login kopieren

Benchmarks

Verschiedene Parsing-Methoden wurden einem Benchmarking unterzogen, um ihre Geschwindigkeitsunterschiede zu demonstrieren. Boost Spirit schnitt am schnellsten ab, gefolgt vom Memory-Mapping-File-Ansatz und den Standard-C-Streams. Die genaue Leistung kann je nach Größe und Komplexität der Daten variieren.

Fazit

Das Parsen von durch Leerzeichen getrennten Floats in C kann mit verschiedenen Techniken optimiert werden. Boost Spirit bietet die höchste Leistung, erfordert jedoch ein besseres Verständnis seiner Parsing-Mechanismen. Speicherabgebildete Dateien bieten einen Mittelweg, da sie das Parsen beschleunigen und gleichzeitig die Einfachheit des Codes beibehalten. Herkömmliche C-Streams bleiben eine praktikable Option, wenn auch langsamer in der Berechnung.

Das obige ist der detaillierte Inhalt vonWas sind die schnellsten Methoden zum Parsen von durch Leerzeichen getrennten Gleitkommazahlen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage