减少整体计算时间

时间:2016-06-06 08:29:58

标签: c++

所以我有一个计算量很大的c ++函数,它从文件中提取数字并将它们放入向量中。当我在main中运行此函数时,需要花费很多时间。有可能以某种方式将此函数计算一次,然后链接到主程序,这样每次我尝试运行它时,我都可以在主程序中节省宝贵的计算时间吗?

我的功能是:

vector <double> extract (vector <double> foo)
{
    ifstream wlm;
    wlm.open("wlm.dat");

    if(wlm.is_open())
    {
        while (!wlm.eof())
        {
            //blah blah extraction stuff
        }
        return foo;      
    }
    else 
        cout<<"File didn't open"<<endl;
    wlm.close();
}

我的主程序还有其他我在那里计算的东西。我不想从主程序中调用此函数,因为这需要很长时间。相反,我希望在编译期间预先提取向量,以便稍后在我的主程序中使用提取的向量。这可能吗?

2 个答案:

答案 0 :(得分:2)

  1. 将您的功能更改为:

    std::vector<double>& extract(std::vector<double>& foo)
    
  2. 所以你不会复制矢量两次(我想大部分时间都会吃)。

    1. 根据文件数据尝试reserve()内存中的矢量(如果可能的话,可以避免重新分配)。
    2. 您应该始终返回std::vector<double>,而不仅仅是在结果良好的情况下。
    3. 如果文件成功打开,您应该关闭文件。
    4. 类似的东西:

          std::vector<double>& extract (std::vector<double>& foo)
          {
              ifstream wlm;
              wlm.open("wlm.dat");
      
              if(wlm.is_open())
              {
                  while (!wlm.eof())
                  {
                  //blah blah extraction stuff
                  }
                  wlm.close();
              }
              else 
                  cout<<"File didn't open"<<endl;
      
              return foo;      
          }
      

答案 1 :(得分:1)

虽然你的问题并不完全清楚,但我认为你想:

  • 从大量数据中计算双精度矢量
  • 在程序中使用此计算(较小)的数据集
  • 在编译时进行计算

这当然是可能的,但您必须利用您正在使用的任何构建系统。没有更多细节,我只能给出一般答案:

  1. 创建一个可在编译期间调用的帮助程序。该程序应实现extract函数并将结果转储到文件中。这里有两个主要选择:获取可嵌入到可执行文件中的资源文件,或生成包含数据的源代码。如果数据不是很大,我建议使用后者。

  2. 在程序中使用生成的文件

  3. 例如:

    预建步骤 extract_data.exe extracted_data_generated

    这会将提取的数据转储到标头和源中,例如:

    // extracted_data_generated.h
    #pragma once
    extern const std::array<double, 4> extracted;
    
    // extracted_data_generated.cpp
    #include "extracted_data_generated.h"
    const std::array<double, 4> extracted{ { 1.2, 3.4, 5.6, 6.7 } }; //etc.
    

    在程序的其他部分中,使用生成的数据

    #include "extracted_data_generated.h"
    
    // you have extracted available as a variable here.
    

    我也改成了std::array,你的帮助程序会知道你的大小,因为你会知道矢量的大小。

    资源路由类似,但您必须实现特定于平台的资源提取和读取数据。因此,除非您的计算数据非常大,否则我建议代码生成。