更快的文件操作C ++

时间:2015-11-19 14:18:43

标签: c++ file optimization

所以我正在用c ++和opengl为我的一类制作一个渲染器。我正在制作一个额外功劳的动画程序,它将在我的渲染器在每个帧中读取它们之前更改文本文件中的值。我的问题是这部分代码写得不够快

while (clock() < time_end)
    {
        timeStep = clock() + fps * CLOCKS_PER_SEC;
        for(int k=0; k < currOps.size(); k++)
        {
            // increase/decrease each set once for the current timestep
            // a case for each operation
            int pos = currAxis[k];
            if(currOps[k] == "loc")
            {
                opsFile[8+pos] = patch::to_string(atof(opsFile[8+pos].c_str()) + locScale[pos-1]*timeAdjust);
                //edit this value by loc adjust
            }
            else if(currOps[k] == "rot")
            {
                opsFile[4+pos] = patch::to_string(atof(opsFile[4+pos].c_str()) + rotScale[pos-1]*timeAdjust);
                //edit this value by rot adjust
            }
            else if(currOps[k] == "scl")
            {
                opsFile[pos] = patch::to_string(atof(opsFile[pos].c_str()) + sclScale[pos-1]*timeAdjust);
                //edit this value by scl adjust
            }
        }
        currFile.close(); //save file and restart so we don't append multiple times
        currFile.open(files[location[0]].c_str(), ofstream::out); // so we can write to the file after closing
        for(int j=0; j <opsFile.size(); j++)
        {
            // update the file
            currFile << opsFile.at(j);
            currFile << "\n";
        }

        while(clock() < timeStep)
        {
            //wait for the next time steps
        }
    }

最后是currFile操作。如果我将currFile操作取出,它将以所需的fps运行。 FPS设置为.033,因此它的速度为30 fps。当fps = 0.1时,它也会运行得足够快。任何优化都会很棒。如果需要查看我的代码的任何其他部分,请告诉我,我将上传。整件事大概是170行。 currOps,files和opsFile是字符串的向量 sclScale,rotScale和locScale是双精度矢量 currAxis是整数的载体

2 个答案:

答案 0 :(得分:3)

以下是一些可能有所帮助的一般性更改:

  1. 我会将curOps转换为枚举而不是字符串(保存字符串比较。)看起来你应该预先处理该容器并构建一系列枚举(然后你的代码在循环中变为一个switch
  2. 不要将vector<string>用于curOps,只需从文件中读取浮点数并将浮点数写出来 - 这将为您节省所有与字符串无关的转换。如果你想进一步使用它,将文件转换为二进制文件(如果练习允许的话),并存储一个包含你需要的浮点数的简单结构并使用内存映射文件(你不需要提升它) ,它只是直接使用mmap!)
  3. 在进入mmap路由之前 - 尝试从文件中读取/写入浮点数。例如,让我们说每个&#34; row&#34;在您的文件中对应于以下内容:

    struct transform {
      double x, y, z;
    };
    
    struct op {
      transform scale, rot, loc;
    };
    

    为这些声明一组流入/出运算符(例如:

    std::ostream& operator<<(std::ostream& os, const transform& tx) {
      return os << tx.x << ' ' << tx.y << ' ' << tx.z;
    }
    std::istream& operator>>(std::istream& is, transform& tx) {
      return is >> tx.x >> tx.y >> tx.z;
    }
    

    op

    需要类似的设置

    现在您的向量为std::vector<op>,您可以轻松地从文件中流入和传出,例如,阅读:

    op i;
    while(file >> i) { curOps.push_back(i); }
    

    写:

    for (auto o : curOps) file << o << '\n';
    

    如果仍然不够,那么mmap(顺便说一句 - 它也可以在Windows上使用:Is there a memory mapping api on windows platform, just like mmap() on linux?

答案 1 :(得分:0)

尝试使用stdio.h中的功能。 iostreams are terribly inefficient

在您的情况下,您需要的只是fseek() ... fputs()。每次避免重新打开文件实际上应该有很多帮助。