2014-01-15 31 views
1

我正在处理一个小部件,用于重新排序菜单。经常读/写一个小文件会降低性能吗?

为此,我添加了像MoveUp,MoveDown,Add,Delete这样的按钮,这些按钮应该改变XML文件中菜单的顺序,因为正在读取XML文件以用于填充菜单。

现在我的问题是,我应用文件打开,写入和关闭操作,每一次点击这些按钮,它们立即变为XML文件。这对我来说是相对简单的方法。鉴于此,小部件也有comboBox,它从xml中读取,然后填充小部件中内部子级子菜单的当前顺序。 (相同的:MS展望 - >工具 - >自定义 - >重新排列命令)

我的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> 

权衡之间频繁的读/写一个小文件,一旦读取,创建一个数据结构来存储数据,最后只写一次,哪一个是更好的选择?

注意:我使用QT DOM与C++来实现所有这些目的。

+2

不知何故,我觉得它是第二个。如果有一个替代频繁的文件读/写,那么为什么不呢。 –

+1

第二个选项可能更方便用户,因为用户可以不加修改地取消。至于性能:它可能对用户没有太大的区别,如果有疑问,可以对其进行配置 –

回答

2

我知道这是不是C#,但我不是用C太喜欢++,所以如果有人能在我填补空白,这将是真棒

在C#中,你只需要加载你的XML到一个XDocument对象和做记忆中的操纵,即时。
完成后,将它们保存到文件中。

这有一个缺点,即当你崩溃时,你的改变消失了。
要迁移这个,你可以保存在一个spefified intervall。
优点是您可以摆脱频繁的文件访问。

如果性能降低,问题取决于您执行IO操作的方式: 如果您执行异步操作,即使您的操作系统占用一点也不会耗费太多时间,但同步很大程度上取决于操作系统性能,特别是文件系统的业务。

过于频繁的文件操作也会磨损存储设备。我知道我们可能没有在这里谈论EEPROM,它有10k个IO周期,但仍然如此。

有人可以让我知道有没有一个命名空间/图书馆为c + +提供类似的功能?

+1

似乎您要求使用DOM解析器-https://en.wikipedia.org/wiki/Document_Object_Model。对于Windows或Xerces来说,跨平台是最常用的MSXML。关于“我应该在C++中使用什么XML解析器?”这个主题有一个很好的链接 - http://stackoverflow.com/questions/9387610/what- xml-parser-should-i-use-in-c – SChepurin

+0

Qt为此提供了'QDomDocument'。 –

+1

谢谢@Mark,Schepurin和Pavel。我现在正在使用QDomDocument。 它的好方法,现在我只需要按下'OK'按钮就可以在文件中写入 – Maverick33

1

我认为将配置直接写入文件是不好的做法。想象一下,你想获得其他代码中菜单的顺序。例如,如果“文件”菜单被隐藏或移动,您想在某些时刻显示一个消息框。

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

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

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

+0

是的,这种方法肯定看起来更难:P,但正如你上面提出的,我现在使用QDomDOcument,并写入只有在'确定'按钮被按下后文件。 虽然我会遇到你提到的问题,即解析XML和获取菜单顺序 - 创建所有代码的重复...但现在我想以更简单的方式进行操作。 感谢您的建议。 – Maverick33