sipu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1795回复:7

如何提高写硬盘的速度。

楼主#
更多 发布于:2002-10-24 12:52
一个关于内存及硬盘读写的问题。

写内存成块的写比一个字节一个字节的写肯定要快的,但是谁能够告诉我,在C里分别用那个API或者库函数来实现。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-24 13:04
看看File Mapping APIs
一定有用,对你帮助太大了
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-24 13:59
一个关于内存及硬盘读写的问题。

写内存成块的写比一个字节一个字节的写肯定要快的,但是谁能够告诉我,在C里分别用那个API或者库函数来实现。

调用写盘中断来实现
int86
int86x
intdos
intdosx
intr
Tom_lyd
sipu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-24 14:33
To Tom_lyd:

使用Windows的API是否内部调用了写盘中断呢?使用下面的代码fread(mbptr, 1, size, file);

效率应该是非常低的,采用什么样的函数会提高?有没有量的概念?另外,如果不写到硬盘中去,仅在内存中传输或拷贝数据,是否也存在同样的问题?

To Koms Bomb:

正在看,应该会改善,你做过对比没有?
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-24 14:37
To Tom_lyd:

使用Windows的API是否内部调用了写盘中断呢?使用下面的代码fread(mbptr, 1, size, file);

效率应该是非常低的,采用什么样的函数会提高?有没有量的概念?另外,如果不写到硬盘中去,仅在内存中传输或拷贝数据,是否也存在同样的问题?

To Koms Bomb:

正在看,应该会改善,你做过对比没有?
 

File Mapping肯定比FileIO快
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2002-10-24 15:05
调用Windows API不需要考虑这个问题,因为系统本身就有很强大的Cache管理机制帮你做这些了。
sipu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-24 15:36
To fracker:

但是我如果用

memset(ptr,0,size);

或者

ZeroMemory(ptr,size);

哪个会更好呢?又比如

memcpy和CopyMemory哪个会更有效率一些?同样是API,如Koms Bomb
所说一样,File mapping 就比File IO效率要高,有什么好的经验没有?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-24 17:32
关于磁盘调度本身就是操作系统的一个任务,Windows操作系统对此已经有较好的算法,使得磁盘磁头移动的次数最少而写入的数据最多。除之此外,Windows自身已经有了缓冲策略(你可以开一个编辑软件,随意拷一些东西进去,然后Save,你会发现硬盘的灯不一定会亮,这说明,系统已经为你缓存起了,至于什么时候存到硬盘,得看缓冲算法)。而对于DOS系统,这方面的功能不强,有的时候,用户可以用自己的缓冲驱动来完成这种工作。
另一方面,硬盘的读写最小单位是扇区,而不是字节,所以,你即使你只读写一bit,实际读写的也最小是一扇区。
Tom_lyd
游客

返回顶部