AndroidBench&eMMC内存测试速度&Android

问题:
手机eMMC内存,我用Android Bench/安兔兔/鲁大师测出来的速度很快,而自己写Android Tool测试的速度确很慢,这是为什么呢?

主要信息:

  1. 同样是Sequence Write操作,Android Bench测出来的速度为150MB/S,而我的Tool最高只能跑130MB/S,
  2. 我的Tool采用的是Direct IO的方式去写入数据,修改的是Android Native层部分
    3)在抓取的eMMC指令中,AndroidBench的CMD13几乎不花费时间,而我的Tool每次都会花费大概2ms左右
    如下图:图一为Android Bench的Write操作

    img


    图二为我写的Tool的Write操作,两者时间差异在CMD13消耗的时间上

    img

我的IO方式(Android Native层),C代码:

      1)申请内存                            --  只申请一次
            requestSpace = posix_memalign((void**)&jbArray,4096,jbArraySize);//Size为1024*1024 = 1MB
      2)创建文件,获取对应句柄   --  只调用一次
            fileHandle = open(filePath, O_WRONLY | O_CREAT | O_NOCTTY | O_DIRECT | O_APPEND |O_TRUNC, S_IRUSR | S_IWUSR);   
      3)写入数据                            --  循环调用512次,写入51MB数据,只会记录该循环写入的时间
            for(int i = 0; i<512; i++)
            {
                writeLength = write(fileHandle,jbArray,length);   //length长度为1024*1024 = 1MB,单次Write1MB
            }
  

结果:
我的Tool执行时间 计算出来的速度 比AndroidBench计算出来的速度慢,使用UFS内存的设备上差距更加明显

尝试过的方法:
1) IO方式中,试过mmap和Java IO的方式,都比Direct IO慢
2)修改过单次写入的数据大小,1MB和4KB没有什么差距,4KB速度反而稍慢

我想要的结果:
我想知道为什么会造成这种速度差异,我该如何修改,我目前只能做Native层的优化,希望能有巨佬帮忙解惑,非常感谢

那就可以,做一些优化:用预先缓存的数据进行写入,这可以提高写入速度;用更快的eMMC驱动,这可以提高读写速度。用其他的缓存技术,例如mmap,来提高读写速度。用用户空间的缓存来提高读写速度。在底层优化写入的硬件驱动。

专业的测试软件和我们自己测试的有差别是很正常的,可以搜索安兔兔软件实现方法看看,最后想说的就是,测评软件也不一定准确,它需要兼容很多类型的手机,误差可能会稍微大一点,自己的测试方法可以结合机型进行调整。

抓取火焰图,要去看看安兔兔的测试调用的方法是什么。

如果可以 去反编译看看 调用的大概流程。 可以用idea 去看看动态库。

您的代码使用了Direct IO方式进行写入操作,而Android Benchmark使用的是默认的文件系统IO方式。Direct IO方式相对于默认的文件系统IO方式,在磁盘读写性能上有更好的表现。然而,它还需要满足一些额外的要求,例如对齐缓冲区和文件大小。

你的代码中,使用了posix_memalign函数申请内存,这是一种在操作系统层面上对齐内存的方法。但是,由于你在open函数中没有使用O_DIRECT标志,导致文件大小并没有对齐。这可能是造成速度差异的原因之一。

另外,还需要考虑你的写入次数和单次写入的数据大小。代码中,你使用了512次循环写入,每次写入1MB的数据,这可能导致文件系统频繁地进行磁盘操作。而Android Benchmark可能使用了更大的单次写入数据量和更少的写入次数,从而减少了磁盘操作次数。

建议你可以尝试使用O_DIRECT标志和posix_memalign函数结合来对齐文件和缓冲区,并考虑增加单次写入数据量和减少写入次数。

可能的原因有:

Android Bench 使用了第三方库或者特殊的方式去优化读写操作,而你的Tool没有使用这些优化方式。
Android Bench 可能使用了缓存机制,在写入数据之前缓存了一部分数据,而你的Tool没有使用缓存。
Android Bench 可能使用了多线程来并行读写操作,而你的Tool没有使用多线程。
CMD13几乎不花费时间是因为Android Bench使用了预先写入,而你的Tool没有使用预先写入。
建议你可以检查一下你的代码,看看是否存在上述问题。另外,你可以尝试使用第三方库或者其他工具来优化你的读写操作。

题主您好,这个问题,我认为应该分两个方向看
1,首先,Android Benchmark使用的是默认的文件系统IO方式,并不是使用的D IO的方式,原因的话,因为它是一个测试软件,肯定是使用最常见的读写方式,而非D IO方式,所以这个差别还是比较大的
2,文件读写和D IO读写差别还是挺大的,并非D IO一定比文件读写快,如果D IO你操作不好传递数据对齐、数据区对齐的话,肯定依然没有文件读写快的,还不如使用mmap,经过页缓存