- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图找出为什么 OkHttp 使用 Okio 而不是 BufferedInputStream 和 BufferedOutputStream 来缓冲数据。我用下面的代码来验证:
private String targetPath = Environment.getExternalStorageDirectory()
+ File.separator + "performance.dat";
private InputStream getInputStream() {
try {
File targetFile = new File(targetPath);
if (targetFile.exists()) {
targetFile.delete();
}
targetFile.createNewFile();
return new FileInputStream("/sdcard/file.zip");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void bufferedIO(View view) {
new Thread() {
@Override
public void run() {
InputStream inputStream = getInputStream();
if (inputStream == null) {
return;
}
long start = System.currentTimeMillis();
inputStream = new BufferedInputStream(inputStream, 8192);
File targetFile = new File(targetPath);
BufferedOutputStream fileOutputStream = null;
try {
fileOutputStream = new BufferedOutputStream(new FileOutputStream(targetFile, true), 8192);
byte[] buffer = new byte[4096];
int count;
while ((count = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, count);
}
fileOutputStream.flush();
Log.i("performance", "BufferedInputStream and BufferedOutputStream: " + (System.currentTimeMillis() - start) + "ms");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
public void okio(View view) {
new Thread() {
@Override
public void run() {
InputStream inputStream = getInputStream();
if (inputStream == null) {
return;
}
long start = System.currentTimeMillis();
File targetFile = new File(targetPath);
Source bufferSource = Okio.buffer(Okio.source(inputStream));
BufferedSink bufferSink = null;
try {
bufferSink = Okio.buffer(Okio.sink(targetFile));
while ((bufferSource.read(bufferSink.buffer(), 4096)) != -1) {
bufferSink.emitCompleteSegments();
}
bufferSink.flush();
Log.i("performance", "okio: " + (System.currentTimeMillis() - start) + "ms");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bufferSource.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bufferSink != null) {
try {
bufferSink.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
我调用了 5 次 bufferedIO(),结果是:
357ms
299ms
311ms
324ms
331ms
我调用了 okio() 5 次,结果是:
524ms
661ms
555ms
525ms
573ms
从结果来看,BufferedInputStream 和 BufferedOutputStream 比 Okio 效率更高。我的验证有问题吗?
最佳答案
我在桌面上运行了这个基准测试,结果非常不一致。我认为基准测试最终衡量的是文件系统性能,而不是 I/O 库。
我去掉了 Okio 基准测试中的额外间接寻址,从 Source
而不是中间的 FileInputStream
开始。我还删除了 Okio 不需要的逐页循环:您只需调用 writeAll()
即可将整个源复制到接收器:
public void okio() throws IOException {
long start = System.currentTimeMillis();
File targetFile = new File(targetPath);
targetFile.delete();
try (BufferedSink sink = Okio.buffer(Okio.sink(targetFile));
Source bufferSource = Okio.source(new File(sourcePath))) {
sink.writeAll(bufferSource);
System.out.println("okio: " + (System.currentTimeMillis() - start) + "ms");
}
}
由于文件系统性能的原因,我的结果非常不一致 - 每次运行的差异超过 200%。
okio: 67ms java.io: 106ms
okio: 98ms java.io: 106ms
okio: 108ms java.io: 110ms
okio: 121ms java.io: 113ms
okio: 125ms java.io: 116ms
okio: 131ms java.io: 118ms
okio: 143ms java.io: 143ms
okio: 154ms java.io: 145ms
okio: 191ms java.io: 146ms
okio: 217ms java.io: 239ms
总体而言,Okio 在这里更有效率,但这可能只是运气。更好的基准将隔离不可靠的文件系统 I/O。如果您想尝试一下,我对结果很感兴趣!
关于android - 为什么 Okio 比 BufferedInputStream 和 BufferedOutputStream 更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44904083/
我有一个运行良好的应用程序,但有时当我向我的程序添加一些类和代码时,我的应用程序崩溃了。在我的 logcat 错误是这样的: 8871-8929/com.example.first E/Androi
在使用 Android Studio 运行我的代码时,它会生成此错误: Warning: Conflict with dependency 'com.squareup.okio: okio'. Res
我已经包含 okhttp3 并在低于 LOLLIPOP (api 21) 的安卓版本中测试了 PATCH 和 DELETE 方法。我没有包括 Okio,它运行良好。但是,在 okhttp site他们
我开始收到有关 的错误 **InvalidPackage: Package not included in Android** ../../../../../../../.gradle/caches/
我正在使用 OkHttp(首先是原始版本,然后我升级到 OkHttp3),我的应用程序的一些用户报告说,当应用程序未运行时,电池生命周期会显着下降。 我运行了一个分析器,结果是这样的: 如您所见,Ok
我的团队正受此困扰issue使用 slack 集成来上传文件,因此根据该问题中的评论,我想限制我们的 Kotlin 实现中的请求。 我正在尝试集成 Okio Throttler在 OkHttp 拦截器
i am getting this error when after integrating the OverAir sdks in Gradle and i dont know which one
大家好,我正在从 Android 设备读取原始音频,我想使用 Okio 将其写入文件中像这样: BufferedSink sink = Okio.buffer(Okio.sink(file)); 我有
我的系统需要使用 WAV 文件数组的字节创建单个 WAV 文件。目前它使用 Okio 在缓冲区上读取和写入数据,然后将数据写入最终文件。 我正在关注此文档和此堆栈溢出问题: http://tiny.s
已经在给定的解决方案下实现,但没有一个能正常工作,仍然面临下面列出的警告。 Warning: okio.DeflaterSink: can't find referenced class org.co
我正在尝试将此工作文件下载代码转换为 Reactive。但是由于我对 RxJava 知之甚少,卡住了。你能帮我把它变成 Reactive 吗? public void downloadFile(Mes
使用 OkHttp Websocket 时 listener使用 ByteString 向应用程序提供二进制有效负载。我想将这些字节输入到一些需要 okio.Source (在本例中为 GzipSou
我注意到 fabric 中有这样的异常,这种异常很少发生,但每次构建时,每周 2-3 个用户(约 500 DAU)会发生 3-5 次崩溃我没有找到有关此类崩溃的任何信息,有人知道是什么原因造成的吗?
我正在尝试使用 OkHttp 下载文件并使用 Okio 写入磁盘。我还为这个过程创建了一个 rx observable。它正在运行,但是它明显比我以前使用的(Koush 的 Ion 库)慢。 下面是我
我试图找出为什么 OkHttp 使用 Okio 而不是 BufferedInputStream 和 BufferedOutputStream 来缓冲数据。我用下面的代码来验证: private Str
我有一个应用程序可以从网络上下载内容。音乐、视频、pdf……就像一个下载管理器。 但现在每次下载内容时都会崩溃: E/LVN/advanced_memory_manager.c: ----------
在我们的应用程序中,我使用此代码下载图像文件。我需要在 UI 上显示下载进度(下载字节数百分比)。如何在此代码中获取下载进度?我搜索了解决方案,但仍然无法自行解决。 Observable downlo
我正在集成 Outlook API 并进行 HTTP 调用,我正在使用 改造版本 2.3.0 和 okHttp3 版本 3.9.1。 但是,当我进行 HTTP 调用时,例如: // Create a
问题是标题所说的。它只发生在有时和一些电话上。听说是我抓到的日志。 java.lang.IllegalStateException closed okio.RealBufferedSink.write
我遇到了依赖项问题,在某个地方我对 okio.Buffer$2 和可能对 okio.AsyncTimeout 有双重依赖(它在尝试解决问题时突然出现,但我在隔离问题时遇到了麻烦)。这是我的依赖项。 i
我是一名优秀的程序员,十分优秀!