0

这应该显示内部和外部内存速度,但不幸的是它说它是 0.02 或 0.04 MB/s?这是 Android 的一个巨大的低效率,还是编码错误?

findViewById(R.id.buttonStorageSpeed).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                double SDSpeed = MBPSTest(getExternalCacheDir()); // /sdcard
                double MemSpeed = MBPSTest(getCacheDir());        // /data/data
                final AlertDialog dialog = new AlertDialog.Builder(thisContext)
                .setTitle("Memory speed")
                .setMessage( "Internal:"+String.valueOf(MemSpeed) + "\n"  + "SD:"+String.valueOf(SDSpeed))
                .create();
                dialog.show();
            }
        });




/**
     * Test MB/s write speed in some directory.
     * Writes 4MB, deletes it after.
     * @param outdir
     * @return
     */
    private double MBPSTest(File outDir) {

        long start = System.currentTimeMillis();
        try {
            for (int fnum = 0; fnum < 1024; fnum++) {
                File out = new File(outDir,"TESTspeed"+String.valueOf(fnum));
                FileOutputStream fos = new FileOutputStream(out);

                //Write 4k files
                for (int i=0; i < 1024; i++) {
                    fos.write(65);//A
                    fos.write(69);//E
                    fos.write(73);//I
                    fos.write(79);//O
                }
                fos.flush();
                fos.close();
                //System.out.println("Wrote file.");
            }
            //Wrote 4MB

            //Toast.makeText(getApplicationContext(), "Wrote External at: "+String.valueOf(4.0 / (elapsed/1000.0) )+" MB/S", Toast.LENGTH_LONG).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return 0;
        } catch (IOException e) {
            e.printStackTrace();
            return 0;
        }

        long elapsed = System.currentTimeMillis() - start;

        //Clean up:
        for (int fnum = 0; fnum < 1024; fnum++) {
            File out = new File(outDir, "TESTspeed"+String.valueOf(fnum));
            out.delete();
        }
        // 4 MB / (seconds)
        return 4.0 / (elapsed/1000.0);
    }
4

2 回答 2

2

除了 Jonathon 提到的频繁打开和关闭文件的开销之外,您还需要调用write(int)每个字节。

要么使用write(byte[])大缓冲区,要么使用 aBufferedOutputStream来包装FileOutputStream. 可能已经有一些缓冲FileOutputStream,但同样可能没有。您可能会发现,一旦写入操作减少(但数据量仍然相同),速度就会快得多

于 2014-05-25T07:17:03.580 回答
0

你在这里引入了大量的开销:

        for (int fnum = 0; fnum < 1024; fnum++) {
            File out = new File(outDir,"TESTspeed"+String.valueOf(fnum));
            FileOutputStream fos = new FileOutputStream(out);

            //Write 4k files
            for (int i=0; i < 1024; i++) {
                fos.write(65);//A
                fos.write(69);//E
                fos.write(73);//I
                fos.write(79);//O
            }
            fos.flush();
            fos.close();
            //System.out.println("Wrote file.");
        }
        //Wrote 4MB

您每 4k (每个文件 1024 次)关闭和打开文件。相反,您应该只在循环外打开一次。

这还远不是一个科学的测试。您正在进行一堆 API 调用,这些调用不会显示设备的真实速度。此外,您可能会有一堆文件系统重新调整大小的开销。

更好的方法可能是:

  • 打开文件
  • 写入所需大小的数据
  • 寻找文件的开头
  • 冲洗
  • 启动计时器
  • 在尽可能大的块中写入所需大小的数据
  • 停止计时器
  • 清理
于 2014-05-25T07:13:47.387 回答