Код Android CTS о расчете пропускной способности хранилища

Мне нужно рассчитать пропускную способность хранилища на моем устройстве Android, и я нашел исходный код для расчета последовательной пропускной способности RW хранилища в Android CTS.

FileUtil.java

public static long getFileSizeExceedingMemory(Context context, int bufferSize) {
    long freeDisk = SystemUtil.getFreeDiskSize(context);
    long memSize = SystemUtil.getTotalMemory(context);
    long diskSizeTarget = (2 * memSize / bufferSize) * bufferSize;
    final long minimumDiskSize = (512L * 1024L * 1024L / bufferSize) * bufferSize;
    final long reservedDiskSize = (50L * 1024L * 1024L / bufferSize) * bufferSize;
    if ( diskSizeTarget < minimumDiskSize ) {
        diskSizeTarget = minimumDiskSize;
    }
    if (diskSizeTarget > freeDisk) {
        Log.i(TAG, "Free disk size " + freeDisk + " too small");
        return 0;
    }
    if ((freeDisk - diskSizeTarget) < reservedDiskSize) {
        diskSizeTarget -= reservedDiskSize;
    }
    return diskSizeTarget;
}

Эта функция собирается создать файл из ОЗУ в хранилище (записать) и затем прочитать обратно.

Мне было просто интересно:

long diskSizeTarget = (2 * memSize / bufferSize) * bufferSize;

Зачем им нужно подготовить файл размером примерно с двойной оперативной памяти?

Я когда-либо пробовал размер файла, равный половине размера оперативной памяти (размер оперативной памяти моего устройства =2 ГБ), и скорость записи выглядит нормально, но скорость чтения слишком высокая (около 200 МБ / с).

Но результат выглядит хорошо, когда я использую около 4 ГБ файла (двойной размер оперативной памяти) и 2 ГБ.

(Параметры размера буфера 10 МБ для чтения и записи)

Вот коды для чтения и записи:

SequentialRWTest.java

public void testSingleSequentialRead() throws Exception {
    final long fileSize = FileUtil.getFileSizeExceedingMemory(getContext(), BUFFER_SIZE);
    if (fileSize == 0) { // not enough space, give up
        return;
    }
    long start = System.currentTimeMillis();
    final File file = FileUtil.createNewFilledFile(getContext(),
            DIR_SEQ_RD, fileSize);
    long finish = System.currentTimeMillis();
    String streamName = "test_single_sequential_read";
    DeviceReportLog report = new DeviceReportLog(REPORT_LOG_NAME, streamName);
    report.addValue("file_size", fileSize, ResultType.NEUTRAL, ResultUnit.NONE);
    report.addValue("write_throughput",
            Stat.calcRatePerSec((double)fileSize / 1024 / 1024, finish - start),
            ResultType.HIGHER_BETTER, ResultUnit.MBPS);
    final int NUMBER_READ = 10;
    final byte[] data = new byte[BUFFER_SIZE];
    double[] times = MeasureTime.measure(NUMBER_READ, new MeasureRun() {
        @Override
        public void run(int i) throws IOException {
            final FileInputStream in = new FileInputStream(file);
            long read = 0;
            while (read < fileSize) {
                in.read(data);
                read += BUFFER_SIZE;
            }
            in.close();
        }
    });
    double[] mbps = Stat.calcRatePerSecArray((double)fileSize / 1024 / 1024, times);
    report.addValues("read_throughput", mbps, ResultType.HIGHER_BETTER, ResultUnit.MBPS);
    Stat.StatResult stat = Stat.getStat(mbps);
    report.setSummary("read_throughput_average", stat.mAverage, ResultType.HIGHER_BETTER,
            ResultUnit.MBPS);
    report.submit(getInstrumentation());
}

И функция createNewFilledFile в FileUtil.java

public static File createNewFilledFile(Context context, String dirName, long length)
        throws IOException {
    final int BUFFER_SIZE = 10 * 1024 * 1024;
    File file = createNewFile(context, dirName);
    FileOutputStream out = new FileOutputStream(file);
    byte[] data = generateRandomData(BUFFER_SIZE);
    long written = 0;
    while (written < length) {
        out.write(data);
        written += BUFFER_SIZE;
    }
    out.flush();
    out.close();
    return file;
}

0 ответов

Другие вопросы по тегам