Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 频繁读取/写入小文件是否会降低性能?_C++_Xml_Qt_Dom - Fatal编程技术网

C++ 频繁读取/写入小文件是否会降低性能?

C++ 频繁读取/写入小文件是否会降低性能?,c++,xml,qt,dom,C++,Xml,Qt,Dom,我正在开发一个小部件,用于重新排列菜单 为此,我添加了几个按钮,如MoveUp、MoveDown、Add、Delete,这些按钮用于更改XML文件中菜单的顺序,因为正在读取XML文件以填充菜单 现在我的问题是,我已经为这些按钮的每一次点击应用了文件打开、写入和关闭操作,这些操作会立即变成xml文件。这对我来说是相对容易的方法。鉴于此,小部件也有comboBox,它从xml中读取数据,然后填充小部件内部子菜单的当前顺序。(与:MS outlook->工具->自定义->命令相同) 我的XML文件是一

我正在开发一个小部件,用于重新排列菜单

为此,我添加了几个按钮,如MoveUp、MoveDown、Add、Delete,这些按钮用于更改XML文件中菜单的顺序,因为正在读取XML文件以填充菜单

现在我的问题是,我已经为这些按钮的每一次点击应用了文件打开、写入和关闭操作,这些操作会立即变成xml文件。这对我来说是相对容易的方法。鉴于此,小部件也有comboBox,它从xml中读取数据,然后填充小部件内部子菜单的当前顺序。(与:MS outlook->工具->自定义->命令相同)

我的XML文件是一个大约1.5K的小文件。 我想知道哪种选择更好

i) 我上面提到的一个,每次鼠标点击打开读写XML文件

ii)创建一个数据结构,一旦读取文件,存储数据,所有活动都会使用该数据进行,然后通过OK按钮将数据写入实际的XML文件

我个人喜欢(I)选项,它在总体上非常容易实现。 如果(ii)一个是更好的选择,那么我应该使用什么样的数据结构? XML文件格式如下所示:

<menu>
<action id="1">menu1</action>
<action id="9">menu2</action>
<submenus id="5" name="submenus 1">
        <action id="17">menu14</action>   
    </submenus>
<action id = "10">menu1</action>
<submenus id="7" name="submenus 1">
        <action id="3">menu14</action>   
    </submenus>
<action id="11">menu2</action>
</menu>

菜单1
菜单2
菜单14
菜单1
菜单14
菜单2
在频繁读取/写入小文件和一次读取之间进行权衡,创建数据结构来存储数据,最后只写入一次,哪一个是更好的选择

注:我用QT DOM用C++来完成这一切。

我知道这不是C,但是我不太喜欢C++,所以如果有人能填空,那就太棒了。 在C#中,您只需将Xml加载到XDocument对象中,并在内存中进行操作,即即时操作。
完成后,将它们保存到文件中

这样做的缺点是,当您崩溃时,您的更改将消失。
要实现这一点,您可以在特定的时间间隔内保存。
优点是您可以摆脱频繁的文件访问

是否存在性能损失的问题取决于您执行IO操作的方式: 如果异步执行,即使操作系统有点忙,也不会浪费太多时间,同步在很大程度上取决于操作系统的性能,尤其是文件系统的业务

此外,过于频繁的文件操作也会磨损存储设备。我知道我们这里讨论的可能不是具有10k IO周期的EEPROM,但仍然是


有人能告诉我,C++有一个名称空间/库,提供类似的功能吗?

< P>我认为直接把配置写入文件是一种错误的做法。假设您希望在其他代码中获得菜单的顺序。例如,如果“文件”菜单被隐藏或移动,您希望在某些时刻显示一个消息框

现在,您需要打开XML并在每次希望获取此信息时解析它。您需要复制解析XML并从中获取菜单顺序所需的代码

如果您有一个包含设置的结构,您可以将其存储在变量中的某个位置,并随时使用它。没有重复,代码更干净,更容易编写单元测试


一般来说,根据我的经验,我知道为设置创建一个结构是很好的。这种方法一开始看起来很难,但将来很可能会为您节省时间。

不知怎的,我觉得它是第二种方法。如果存在频繁文件读/写的替代方案,那么为什么不呢?第二个选项可能更方便用户,因为用户可以取消,而无需修改。至于性能:它可能对用户没有多大影响,如果您怀疑需要DOM解析器-,请对其进行分析。对于Windows或XRCESS,跨平台通常是MSXML。在主题上“在C++中应该使用什么XML解析器”有一个很好的链接。Qt有“代码> QDOMDOCTON/CODER >。谢谢@马克,Schepurin和帕维尔。我现在正在使用QDomDocument。这是一个很好的方法,现在我只需要在按下“OK”按钮时才在文件中写入是的,这种方法看起来确实更难:P,但正如您上面所建议的,我现在使用QDomDOcument,并且只在按下“OK”按钮后才在文件中写入。虽然我会遇到您提到的问题,解析XML和获取菜单顺序会创建代码的重复,但现在我想用更简单的方式来做。谢谢你的建议。