首頁 >後端開發 >C++ >在 C 中解析空格分隔浮點的最快方法是什麼?

在 C 中解析空格分隔浮點的最快方法是什麼?

Barbara Streisand
Barbara Streisand原創
2024-12-03 10:19:11574瀏覽

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

如何在C 中快速解析空格分隔的浮點數

解析空格分隔的浮點數可能是一項耗時的任務,尤其是在處理大文件時。使用標準 C 流等傳統方法可能會很慢。本文探討了在 C 中解析浮點數的幾種有效方法。

Boost Spirit

Boost Spirit 是一個強大的 C 函式庫,提供高階解析功能。儘管有最初的學習曲線,Spirit 仍提供快速可靠的解析。使用方法如下:

#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;
}

內存映射文件

內存映射文件提供了一種更快的方式將文件讀入內存,而無需傳統 I/O 操作的開銷。這可以顯著加快解析速度:

#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;
}

基準測試

各種解析方法已經過基準測試以展示其速度差異。 Boost Spirit 成為最快的,其次是記憶體映射檔案方法和標準 C 流。確切的效能可能會因資料的大小和複雜性而異。

結論

在 C 中解析空格分隔的浮點數可以使用不同的技術進行最佳化。 Boost Spirit 提供最高的效能,但需要更了解其解析機制。記憶體映射檔案提供了一個中間立場,可以加快解析速度,同時保持程式碼簡單性。傳統的 C 流仍然是一個可行的選擇,儘管計算速度較慢。

以上是在 C 中解析空格分隔浮點的最快方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn