import java.io.*;
public class M {
public static void main(String[] args) throws FileNotFoundException {
StopWatch stopWatch = new StopWatch();
int bufferSize = 8192;
String filename1 = "/Users/paul/Downloads/star1.zip";
FileInputStream fileInputStream = new FileInputStream(new File(filename1));
FileOutputStream fileOutputStream = new FileOutputStream(new File(filename1 + ".copy"));
String filename3 = "/Users/paul/Downloads/star2.zip";
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File(filename3)), bufferSize);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(filename3 + ".copy")));
// 실제론 왜 이게 더 빠름?
byte[] buffer = new byte[bufferSize];
try {
stopWatch.start();
while (true) {
if (fileInputStream.read(buffer) == -1) break;
fileOutputStream.write(buffer);
}
fileInputStream.close();
fileInputStream.close();
stopWatch.stop();
System.out.println(stopWatch);
} catch(IOException e) {}
// 이게 더 빠르다며
try {
stopWatch.start();
int data;
int readCount = 0;
byte[] buf = new byte[bufferSize];
while (true) {
// data = bufferedInputStream.read(); 이렇게 하면 bufferedInputStream이 훨씬 느리
data = bufferedInputStream.read(buf, 0, buf.length); // 이렇게 하면 둘다 속도 동일함
if (data == -1) break;
// bufferedOutputStream.write(data);
bufferedOutputStream.write(buf);
readCount++;
}
bufferedInputStream.close();
bufferedOutputStream.close();
stopWatch.stop();
System.out.println(stopWatch);
System.out.println(readCount);
} catch (IOException e) {}
}
}
class StopWatch {
private long start;
private long end;
public void start() {
start = System.currentTimeMillis();
}
public void stop() {
end = System.currentTimeMillis();
}
public long getTime() {
return end - start;
}
public String toString() {
return String.valueOf(getTime());
}
}
public class M {
public static void main(String[] args) throws FileNotFoundException {
StopWatch stopWatch = new StopWatch();
int bufferSize = 8192;
String filename1 = "/Users/paul/Downloads/star1.zip";
FileInputStream fileInputStream = new FileInputStream(new File(filename1));
FileOutputStream fileOutputStream = new FileOutputStream(new File(filename1 + ".copy"));
String filename3 = "/Users/paul/Downloads/star2.zip";
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File(filename3)), bufferSize);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(filename3 + ".copy")));
// 실제론 왜 이게 더 빠름?
byte[] buffer = new byte[bufferSize];
try {
stopWatch.start();
while (true) {
if (fileInputStream.read(buffer) == -1) break;
fileOutputStream.write(buffer);
}
fileInputStream.close();
fileInputStream.close();
stopWatch.stop();
System.out.println(stopWatch);
} catch(IOException e) {}
// 이게 더 빠르다며
try {
stopWatch.start();
int data;
int readCount = 0;
byte[] buf = new byte[bufferSize];
while (true) {
// data = bufferedInputStream.read(); 이렇게 하면 bufferedInputStream이 훨씬 느리
data = bufferedInputStream.read(buf, 0, buf.length); // 이렇게 하면 둘다 속도 동일함
if (data == -1) break;
// bufferedOutputStream.write(data);
bufferedOutputStream.write(buf);
readCount++;
}
bufferedInputStream.close();
bufferedOutputStream.close();
stopWatch.stop();
System.out.println(stopWatch);
System.out.println(readCount);
} catch (IOException e) {}
}
}
class StopWatch {
private long start;
private long end;
public void start() {
start = System.currentTimeMillis();
}
public void stop() {
end = System.currentTimeMillis();
}
public long getTime() {
return end - start;
}
public String toString() {
return String.valueOf(getTime());
}
}
InputStream 써본 놈이 하나도 없단 말이야? 말이 됨?
해당 댓글은 삭제되었습니다.
거기 안나와
저건 스트링버퍼잖아
InputStream이 어디 나옴? 안보이는데
스트림 얘기하는데 뭔 스트링 얘기하노
그냥 구글링 해보면 나오는 내용이라 안 알려준거 아닐까? 일단 전자는 byte[8192] 배열을 지정한 다음에 받고 그걸 처리하는 거고, BufferedInputStream을 사용하면 저런걸 굳이 만들 필요 없이 버퍼를 이용해서 받잖아. 둘이 근본적으로 같은건 맞겠는데 BufferedInputStream이 더 좋은 점이 있으니까 쓸 거 같네. 시간 측정은 좀 더 대량의 데이터에 대해서 실험해봐야 의미가 있을 거 같고.
대량으로 해봤는데 버퍼드 인풋 스트림이 더 느려
저 블로그 봤어 저건 인풋스트림은 1 바이트씩 읽고 버퍼드 인풋 스트림은 8192 바이트씩 읽어서 같은 조건이 아니라 비교가 안됨
이 글 보면 더 빠르다고 되어있는데 잘 모르겠네.. 니가 실험한 거에서 엄청 크게 차이가 나?
실행시간 2~3배 차이남
이글 못보고 방금 글에 댓글 달앗는데 추가 설명하자면 너가 inpitstream에 쓰는 버퍼가 충분히 크면 bufferedinputstream이랑 별 차이 없는게 맞음. 오히려 bufferedinputstream에 버퍼가 2K정도니까 더 큰 버퍼를 쓰면 그만큼 성능 향상이 잇을 수 잇지 특히 디스크 chunksize에 맞추면
궁금하면 bufferedinpitstream 소스코드를 보면 될듯
난 둘이 속도가 비슷하지 않을까 했는데 이런걸 보니 신기하네.
이미 소스코드 보고 왔음 동일 버퍼 사이즈로 세팅하고 실행했을 때 모든 버퍼 사이즈에서 버퍼드가 실행시간 더 오래걸렸음
그리고 이건 공평한 비교가 아닌게, 일단 파일을 먼저 읽으면 이 파일이 캐시가 되기 때문에 뭐가되었든 나중에 테스트한게 더 빠를 가능성이 높음
그럼 동일 사이즈인 다른 파일로 비교해보고 다시 올게
파일 사이즈 동일한 다른 파일로 해봐도 버퍼드가 훠월씬 느림
java 버전은 11로 테스트했음
얼마나 차이나는데?
본문에 다시 올린 소스 기준 버퍼드 505 인풋스트림 50
파일 사이즈는 40메가정도
캐시일까 싶어 둘이 실행 순서 바꿔봐도 버퍼드가 더 느림
조금의 오버헤드면 나도 이해하겟는데 10배 차이나는 건 잘 모르겟다. 정 궁금하면 bufferedinputreader 소스코드 그대로 inputstream 작성한다음에 기능 하나씩 지우면서 어디서 오버헤드가 발생하는지 알아보던지
아니 코드 다시 읽어보니까 bufferedinputstream 쪽 테스트 코드는 바이트 하나당 함수호출을 한번씩 하고 있잖아 그럼 많이 느릴 수 밖에 없지 공평한 비교를 하려면 fileinpitstream쪽도 byte하나당 무언가를 하던지
버퍼드 read 하면 내부에서 fill() 메소드 실행하면서 버퍼 사이즈 꽉 찰때까지 읽는건데? 웬 1바이트당 함수 호출을 1번씩 해
bufferedinputstream은 fill할때까지 읽지만 너의 테스트 코드가 read호출을 1바이트당 한번씩 하고 있잖아 while루프가 몇번 도는지 확인해봐 40메가면 4천만번 루프돌겟네
너가 최종적으로 필요한게 byte단위면 둘다 byte단위로 테스트 하고, 너가 byte[]가 필요한거면 둘다 byte[]단위로 테스트 해야지 한쪽은 byte한개 단위로 무언가를 하는데 다른 한쪽은 byte 만개씩 처리를 하면 공평한 비교가 아니지. bufferedinputstream 쪽은 함수 호출을 4천만번 더 하고 잇잖어
그럼 BufferedInputStream 쪽에는 무슨 메소드를 써야되는데?
너의 목적에 따라 다르겠지만 byte단위로 읽을 필요가 없으면 byte[]로 받는 메쏘드를 써야겟지
BufferedInputStream에 리턴타입 byte[]인 메소드가 없어
그 테스트는 잘 한 테스트야.. 둘다 read()로 읽고 있잖아 너가 한것처럼 하나는 read(byte[])로 읽고 다른 하나는 read()로 한게 아니라
byte[]를 리턴하는 거 찾으라는게 아니고 테스트 코드의 fileinpitstream.read(byte[])처럼 너가 어레이에 받을 수 잇는 걸 쓰라는 말임
BufferedInputStream 예제 찾아보면 다 read() 메소드가 -1 리턴할 때까지 호출하던데? InputStream은 read(buffer) 메소드를 지원해주잖아. 그러니까 InputStream이 더 성능 좋은 거 아니야?
buffer가 도입된 이유를 알면 이따위 질문은 안할텐데
소스 보고 댓글 담? 둘다 버퍼 써서 read 하는 메소드임
내가알기론 보조스트림인 BufferedInputStream이 입출력기능자체는없는걸로암 왜냐면 말그대로 보조스트림이거든 그말은 시스템의 버퍼를 이용하는건데 단순히 입출력 속도테스트하면 FileInputStream이 더 빠를꺼란 느낌은듬 데이터를 직접 보내주니까 대신 BufferedInputStream은 FileInputStream과는 다르게 시스템 버퍼에 다 넣어놓고 한번에 뿌릴수있는 기능이있어서 성능이 향상된다는 뜻이아닐까
무슨 말인지 잘 이해가 안가네. OutputStream까지 적용한 실행시간비교를 해보면 버퍼드가 더 빠를 거란 얘기임?
https://velog.io/@kkimbj18/%EB%B2%84%ED%8D%BC%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-Feat.-BufferedReader-vs-Scanner-cache
내 질문은 그게 아냐 본문 다시 읽어봐
다시 읽은 거 맞아?
입력을 일정하게 해서 그런거아님?
ㅋㅋ 확실히 이건 안 읽고 댓글 달았네..
해당 댓글은 삭제되었습니다.
그래 퍼블릭 메소드에 int read(byte[] b, int off, int len) 라는 게 있기는 한데 BufferedInputStream의 내장 버퍼 protected volatile byte[] buf;는 프로텍티드 잖아. 내장 버퍼를 어케 써?
나도 그게 궁금함.. byte[] 짜서 비교하면 의미가 없고..
https://www.geeksforgeeks.org/bufferedinputstream-read-method-in-java-with-examples/
를 보면 결국 byte 배열을 선언한 다음에; 거기에 받고 그걸 버퍼로 옮기는듯?...
https://joont92.github.io/java/%EC%9E%85%EC%B6%9C%EB%A0%A5/
BufferedInputStream에서 private int read1(byte[] b, int off, int len) 보면 private int read1(byte[] b, int off, int len) 여길 타던데? 그럼 InputStream의 public int read(byte[] b, int off, int len)로 타는 거잖아. fileInputStream.read(buffer) 하는 거랑 똑같은 거잖아.
일단 저 위의 실험이 잘못된 이유는 명확한 듯. byte[8192] 똑같이 선언해서 실험해주면 안 될까? 나도 궁금해서 그래. 아니면 BufferedInputStream이 있을 이유가 없는데...
ㅇㅇ 속도가 차이가 안 나면 니 말이 맞지.
본문에 소스 다시 올림. 8192로 똑같이 선언함
BufferedInputStream 110 라인을 보면 결국 InputStream의 read(파라미터 3개짜리)를 호출하고 있음. 그러면 굳이 BufferedInputStream를 쓸 이유가?
BufferedInputStream의 read에는 As an additional convenience, it attempts to .. 라고 되어있으니 InputStream의 read랑 완전히 같진 않겠지. 실제로 이런게 와닿게 써볼 기회가 있으면 좋겠다..
아니 내가 새로 쓴 글 봐봐. 버퍼드가 무조건 짱짱맨은 아닌 거 같애