CE6的文件读写过慢的问题(可能和cache相关)

博说医械研发 2013-04-10 11:22:37
定制CE6系统,使用的是inand作为存储器,代替nand flash.

现在客户的程序用fopen和fread函数读数据的时候很慢,
我们专门写了一个很简单的测试fopen和fread函数的程序,这个程序会从一个10MB的文件中随机读取一定的数据,每次执行读取1000次,这1000次都是随机长度和随机位置,
发现系统刚开机和suspend /resume后的第一次执行这个程序耗时3秒多,后续每次都会在5秒以上。
也就是说刚开机和resume后读一个文件很快,下次再读就很慢。

注册表中设置
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS\Filters\CacheFilt]
"EnableFileCache"=dword:0
或者是在组件中删除file cache 组件都没有用。
"EnableFileCache"=dword:0 时表现和上边描述的效果一样。

而如果直接删除file cache 组件则每次都是5秒以上,不会有3秒的情况。

请各位了解的朋友提供一些帮助。

非常感谢!!!
...全文
638 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fqipkh 2013-05-29
  • 打赏
  • 举报
回复
不明白,路过
moquan1100 2013-05-28
  • 打赏
  • 举报
回复
这个cache在wince workspace中已经加好,想不用它,在workspace中去掉才管用,注册表和bib中去掉是有问题的。 另外,文件读写的适合会分配动态还是静态的memory,也会有影响
JackwenLee 2013-05-09
  • 打赏
  • 举报
回复
去掉CacheFilt组件,读写速度就大大提高。
博说医械研发 2013-04-16
  • 打赏
  • 举报
回复
应该是DMA吧,A5的BSP看起来太复杂。
gooogleman 2013-04-14
  • 打赏
  • 举报
回复
inand 驱动是否是DMA模式?确认一下。 我也测试一下我的S5pv210 刚刚实现的inand /SDMMC wince6.0 系统的读写速度。
Fighting959800 2013-04-12
  • 打赏
  • 举报
回复
我也想提高读写效率,没有解决!!!
博说医械研发 2013-04-11
  • 打赏
  • 举报
回复
这个问题我们了解过,客户是CE5上的AP移植到CE6上,用的是fopen,不想改程序,而这个两个fopen的程序在他们另外一台也是INAND的CE6机器上速度是很好的,所以现在是必须我们改OS,而不是改AP。 并且用了createfile的FILE_FLAG_NO_BUFFERING后,读的速度普遍是5秒多,而fopen的在开机第一次运行的时候是3秒左右,后边才会超过5秒。 也就是说开机第一次运行fopen比createfile的FILE_FLAG_NO_BUFFERING快很多,再次执行相同的函数就会慢很多。
静若止水 2013-04-11
  • 打赏
  • 举报
回复
你是fopen打开文件的啊? 这里面有个问题,wince默认是开cache的,建议你用createfile试试,因为createfile里有个参数可以设置NO_BUFFER的FLAG,这样就会明显加快文件的读写速度,这个可以确认,因为我上周刚测过
博说医械研发 2013-04-11
  • 打赏
  • 举报
回复
#define READ_TIMES  1000
void read(void)
{
    FILE* fp = _wfopen(FilePath1, L"rb");            // file size must exceed 8MB !
    BYTE* buf = new BYTE[4*1048576];     // 4MB buffer
    srand(GetTickCount());
    READ Read[READ_TIMES];
    for (int i = 0; i < READ_TIMES; i++)
    {
        Read[i].offset = (long)((ULONGLONG)rand() * (ULONGLONG)rand() / (ULONGLONG)(rand() | 1));
        Read[i].length = (size_t)((ULONGLONG)rand() * (ULONGLONG)rand() / (ULONGLONG)(rand() | 1));
        if (Read[i].offset > 4*1048576)  Read[i].offset = 4*1048576;
        if (Read[i].length > 4*1048576)  Read[i].length = 4*1048576;
    }
    DWORD tc1 = GetTickCount();
	for (int i = 0; i < READ_TIMES; i++)
	{
		fseek(fp, Read[i].offset, SEEK_SET);
		fread(buf, 1, Read[i].length, fp);
	}
    DWORD tc2 = GetTickCount();
    delete []buf;
    fclose(fp);
    m_nTest_fread = tc2 - tc1;
}
静若止水 2013-04-11
  • 打赏
  • 举报
回复
测试程序的读写函数贴出来看看,我前段时间刚测过,帮你分析分析
  • 打赏
  • 举报
回复
文件小的时候好像不太会,比如写10个1M的文件比写1个10M快。 我有个程序有记录log,结果,文件越写越大,到了后面特别慢,其实每次写的内容并不是特别多。
博说医械研发 2013-04-11
  • 打赏
  • 举报
回复
引用 3 楼 gooogleman 的回复:
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS\Filters\CacheFilt] "EnableFileCache"=dword:0 哦,你删除这个了,那你的软件writefile 改一下如楼上帖子。 我现在的S5pv210 wince6.0 也是支持INand 和SD卡的了。感觉启动速度很快啊。7S没优……
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS\Filters\CacheFilt] "EnableFileCache"=dword:0 加了这个似乎也没什么效果,并且同样的fread在他们的CE6机器上很快,他们给了那台机器关于文件系统的一些注册表,没看到什么差异,所以现在不知道还有其它哪里可以影响了
九个太阳2023 2013-04-11
  • 打赏
  • 举报
回复
引用 5 楼 accessysq 的回复:
文件小的时候好像不太会,比如写10个1M的文件比写1个10M快。 我有个程序有记录log,结果,文件越写越大,到了后面特别慢,其实每次写的内容并不是特别多。
我也是出现了这个现象,小文件很快,但是大文件就慢了!
gooogleman 2013-04-10
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS\Filters\CacheFilt] "EnableFileCache"=dword:0 哦,你删除这个了,那你的软件writefile 改一下如楼上帖子。 我现在的S5pv210 wince6.0 也是支持INand 和SD卡的了。感觉启动速度很快啊。7S没优化,如果优化估计5S就能启动系统了。不用什么XIP。
gooogleman 2013-04-10
  • 打赏
  • 举报
回复
读的时候不开cache 好像会快点。你改一下注册表。试试。
gooogleman 2013-04-10
  • 打赏
  • 举报
回复
老兄,前几天刚有人拿我的Sate210 测试过SD卡的读写速度问题 你看看这个帖子 http://bbs.csdn.net/topics/390408845

19,518

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧