Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于存储吞吐量计算的Android CTS代码_Java_Android_Ram_Throughput_Cts - Fatal编程技术网

Java 关于存储吞吐量计算的Android CTS代码

Java 关于存储吞吐量计算的Android CTS代码,java,android,ram,throughput,cts,Java,Android,Ram,Throughput,Cts,我需要计算我的Android设备中的存储吞吐量,我在Android CTS中找到了计算存储顺序RW吞吐量的源代码 为什么他们需要准备一个大约两倍ram大小的文件 我曾经尝试过文件大小是ram大小的一半(我的设备ram大小=2GB),写吞吐量看起来正常,但读吞吐量太快(大约200MB/s) 但是当我使用大约4GB文件(两倍ram大小)和2GB时,结果看起来不错 (读写时,buffersize参数为10MB) 以下是读写代码: public void testSingleSequentialRe

我需要计算我的Android设备中的存储吞吐量,我在Android CTS中找到了计算存储顺序RW吞吐量的源代码

为什么他们需要准备一个大约两倍ram大小的文件

我曾经尝试过文件大小是ram大小的一半(我的设备ram大小=2GB),写吞吐量看起来正常,但读吞吐量太快(大约200MB/s)

但是当我使用大约4GB文件(两倍ram大小)和2GB时,结果看起来不错

(读写时,buffersize参数为10MB)

以下是读写代码:

public void testSingleSequentialRead()引发异常{
final long fileSize=FileUtil.getFileSizeExceedingMemory(getContext(),BUFFER_SIZE);
如果(fileSize==0){//没有足够的空间,请放弃
返回;
}
长启动=System.currentTimeMillis();
最终文件File=FileUtil.createNewFilled文件(getContext(),
目录,文件大小);
长时间完成=System.currentTimeMillis();
String streamName=“测试\单次\顺序\读取”;
DeviceReportLog报告=新的DeviceReportLog(报告日志名称、流名称);
report.addValue(“文件大小”,文件大小,ResultType.NEUTRAL,ResultUnit.NONE);
report.addValue(“写入吞吐量”,
Stat.calc((双)文件大小/1024/1024,finish-start),
结果类型越高(越好,ResultUnit.MBPS);
最终整数_READ=10;
最终字节[]数据=新字节[缓冲区大小];
double[]次=MeasureTime.measure(读取的数字,新的MeasureRun(){
@凌驾
公共无效运行(int i)引发IOException{
final FileInputStream in=新FileInputStream(文件);
长读=0;
while(读取<文件大小){
in.读取(数据);
读取+=缓冲区大小;
}
in.close();
}
});
double[]mbps=Stat.calcarray((双)文件大小/1024/1024,次);
report.addValues(“读取吞吐量”,mbps,ResultType.越高,ResultUnit.mbps);
Stat.StatResult Stat=Stat.getStat(mbps);
report.setSummary(“读取吞吐量平均值”),stat.mAverage,ResultType.越高越好,
结果(单位:MBPS);
报告提交(getInstrumentation());
}
以及FileUtil.java中的createNewFilled函数

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;
}
public静态文件createNewFilled文件(上下文、字符串dirName、长)
抛出IOException{
最终整数缓冲区大小=10*1024*1024;
File File=createNewFile(上下文,dirName);
FileOutputStream out=新的FileOutputStream(文件);
字节[]数据=生成器域数据(缓冲区大小);
长写=0;
while(书写<长度){
输出。写入(数据);
写入+=缓冲区大小;
}
out.flush();
out.close();
返回文件;
}

可能是因为虽然您说“此函数将创建一个文件,从RAM读写到存储器。”但实际上它将先写文件,然后再读回。如果文件足够小,副本可能仍在RAM中,因此它可能永远不会直接从存储器中读取。如果文件的大小是RAM的两倍,则文件的开头将被覆盖,因此必须直接从存储器读取。谢谢,TripeHound。是的,它是先写(创建文件),然后读。我已经编辑了这篇文章,再次感谢。我还假设了你所说的。但我的RAM在写入文件后是否可能保持整个文件大小(例如1G)?因为我们只在RAM中首先生成10MB,然后每次将相同的10MB放入存储器。我是这个领域的新手,请指正。非常感谢。我没有详细研究代码,但是10MB看起来就像一次读写“块”的大小。如果写入的总大小小于可用RAM的一半,则正在写入的文件可能会保留在缓存中(取决于其他需要它的内容)。使总大小为RAM大小的两倍可以保证缓存中没有任何内容,因此所有读取都必须来自存储。我理解。谢谢你的好心帮助,ThripeHound。
long diskSizeTarget = (2 * memSize / bufferSize) * bufferSize;
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());
}
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;
}