编辑:整个问题原来是网络问题,但是如果您看到有关如何优化流程的任何想法,我仍然会感激不尽。
我对Servlets还是很陌生,在不久的将来,我遇到了一个与性能有关的问题。我正在尝试通过Google Chrome浏览器中的XHR对象发送视频文件。视频文件存储在Blob对象中。我在JavaScript脚本中使用了此功能:
function upload(blob) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/Test/Odbieracz', true); xhr.onload = function(e) { console.log("loaded"); }; xhr.onreadystatechange = function(){ console.log("state: " + xhr.readyState); }; // Listen to the upload progress. xhr.upload.onprogress = function(e) { console.log("uploading..."); }; xhr.setRequestHeader("Content-Type", "video/webm"); xhr.send(blob); }
它运行良好,因为Blob到达Servlet,在这里我使用以下代码对其进行处理:
byte[] buffer = new byte[16 * 1024]; InputStream input = request.getInputStream(); OutputStream output = new FileOutputStream("costam0.webm"); int bytesRead; while ((bytesRead = input.read(buffer)) != -1){ System.out.println(bytesRead); output.write(buffer, 0, bytesRead); } output.close(); input.close();
它也保存文件。
我确实遇到的问题是它非常慢,根据我的计算,它可以处理大约42kB / s的速度,对于与视频文件有关的Web服务而言,这是非常慢的。我已经在这里坐了几个小时,试图找到一种方法以某种方式加快速度,或者至少找到瓶颈,但是不幸的是,我不知道它可能在哪里。
我的怀疑是浏览器造成了延迟,我在Servlet中使用了一个不同的InputStream来生成一个本地文件(我试图通过XHR上传的文件),并且处理该文件没有问题,花费更少一秒钟。该服务器位于我的本地主机上,因此我认为网络根本不会让我落后太多。
如果以前有人遇到过这个问题,我将不胜感激。
一些想法:
增加缓冲区大小:也许:
byte[] buffer = new byte[1024 * 1024];
不要经常写输出文件。Java必须在缓冲区的其余部分等待时执行昂贵的I / O操作。折衷方案是,如果要处理小文件,则会浪费一些内存。
使用BufferedOutputStream:与上述相同的原因。强烈建议在写入非常大的文件时使用BufferedOutputStream。您甚至不必担心在每个循环中进行编写。循环完成后,只需调用buffOut.flush()进行一次写入即可。例:
BufferedOutputStream
BufferedOutputStream buffOut = new BufferedOutputStream(new FileOutputStream("costam0.webm")); int bytesRead; while ((bytesRead = input.read(buffer)) != -1){ System.out.println(bytesRead); output.write(buffer, 0, bytesRead); } buffOUt.flush()
您在调用println时是否计算了这些计算?不要那样做 您确认该过程有效,只是速度很慢。无需每次都调用println。
另外,您是如何“计算”速度的?