当前位置: 首页 > 知识库问答 >
问题:

为什么我的流复制过程性能稳步下降

祁曦哲
2023-03-14

这段代码在复制大文件时运行得越来越慢。我做错什么了吗?

    InputStream ms2 = new BufferedInputStream(new FileInputStream("/home/fedd/Videos/homevid.mp4"));
    OutputStream fos2 = new BufferedOutputStream(new FileOutputStream("testfile2.mp4", true));

    try {
        int byt;
        int i = 0;
        long time = System.currentTimeMillis();
        while ((byt = ms2.read()) != -1) {
            fos2.write(byt);
            i++;
            if (i > 100000) {
                i = 0;
                long took = System.currentTimeMillis() - time;
                System.out.println("100000 bytes took " + took + " milliseconds which means " + (100000000 / took) + " bytes per second");
            }
        }
        fos2.close();
        ms2.close();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

我的Java是:

OpenJDK10.0.2 2018-07-17OpenJDK运行时环境(构建10.0.2 13-Ubuntu-1ubuntu0.18.04.4)

OpenJDK 64位服务器VM(构建10.0.2 13-Ubuntu-1ubuntu0.18.04.4,混合模式)

共有2个答案

姚嘉容
2023-03-14

由于计算错误,您的性能会下降。对于第二个块,您是从第二个块的大小计算每秒字节数,但从两个块的时间计算。尝试添加time=System。currentTimeMillis() long take=

孔光赫
2023-03-14

每次比较后,你都需要重置基本“时间”。尝试使用以下方法:

if (i > 100000) {
    i = 0;
    long took = System.currentTimeMillis() - time;
    time = System.currentTimeMillis();
    System.out.println("100000 bytes took " + took + " milliseconds which means " + (100000000 / took) + " bytes per second");
}
 类似资料:
  • 我一直被告知,不通过collect和findFirst等方法终止流是不好的做法,但没有真正的反馈,为什么在博客中没有太多关于它的内容。 看看下面的示例,我没有使用大规模的嵌套 if 检查,而是使用 Optional 来取回 List 值。如您所见,我的最后一步是在该流中过滤。这对我来说是预期的,这是为了取回一个列表。为什么这是错误的,我应该如何写它?

  • 我需要在Go中复制一个切片,并读取文档。有一个复制功能可供我使用。 copy内置函数将元素从源片复制到目标片。(作为一种特殊情况,它还会将字节从字符串复制到字节片。)源和目标可能重叠。Copy返回复制的元素数,它是len(src)和len(dst)中的最小值。 但当我这样做的时候: 我的和以前一样是空的(我甚至尝试使用): 你可以去游乐场看看。那么为什么我不能复制一个切片呢?

  • fReceiveBuffer是否存在一个视频帧? 哦,这里是我的FFMPEG初始化代码,需要打开相关视频解码器:http://paste.ubuntu.com/12529760//

  • 问题内容: 我需要在Go中制作切片的副本,并阅读文档,这里有一个复制功能供我使用。 内置复制功能将元素从源切片复制到目标切片。(在特殊情况下,它还会将字节从字符串复制到字节切片。)源和目标可能会重叠。复制返回复制的元素数量,该数量将是len(src)和len(dst)的最小值。 但是当我这样做时: 与以前一样,我是空的(甚至尝试使用): 您可以在运动场上查看。那为什么不能复制切片? 问题答案: 内

  • 我试图运行一个普通的bash脚本,从容器中运行一个工具,并将其输出提取到主机。这就是我到目前为止得到的(当然去掉了脚本本身): 这给出了错误:“无法在停止状态下执行”。正确的执行方式是什么?我的目标是最终运行docker程序并将输出带到主机。

  • 我今天想使用,但出现了如下错误: 所以我想我应该清除并重新安装(如下所示)https://www.rosehosting.com/blog/how-to-install-pip-on-ubuntu-16-04/)但仍然得到: 我怎样才能提高我的水平