JavaScript는 넓은 바이트이든 단일 바이트 문자열이든 문자열 처리에 매우 친숙합니다. 노드는 네트워크 프로토콜 처리, 데이터베이스 운영, 사진 처리, 파일 업로드 등을 처리해야 합니다. 또한 많은 양의 바이너리 데이터를 처리해야 합니다. 내장 문자열은 이러한 요구 사항을 충족시키기에는 거리가 멀기 때문에 버퍼가 탄생했습니다.
버퍼 구조
버퍼는 Javascript와 C++를 결합한 대표적인 모듈입니다. 성능과 관련된 부분은 C++로 구현되고, 성능과 관련되지 않은 부분은 javascript로 구현됩니다.
Node는 프로세스가 시작될 때 이미 Buffer를 메모리에 설치하고 이를 전역 개체에 넣기 때문에 require
Buffer 개체가 필요하지 않습니다. 배열과 유사하며 해당 요소는 두 자리 16진수입니다.
버퍼 메모리 할당
Buffer 객체의 메모리 할당은 V8의 힙 메모리에 없습니다. 메모리 애플리케이션은 Node.js의 C++ 수준에서 구현됩니다.
요청된 메모리를 효율적으로 사용하기 위해 Node는 슬랩 할당 메커니즘을 채택합니다. 슬랩은 다양한 *nix 운영 체제를 적용하는 동적 메모리 관리 메커니즘입니다. Slab에는 세 가지 상태가 있습니다.
(1) 전체: 완전히 할당된 상태
(2) 부분: 부분적으로 할당된 상태
(3) 비어 있음: 할당되지 않은 상태
버퍼 변환
버퍼 개체는 문자와 결합될 수 있습니다. 문자열을 서로 변환하는 지원되는 인코딩 유형은 다음과 같습니다:
ASCII, UTF-8, UTF-16LE/UCS-2, Base64, Binary, Hex
String to Buffer
new Buffer(str, [ 인코딩]) , 기본값은 UTF-8
buf.write(string, [offset], [length], [encoding])
Buffer to string
buf.toString([encoding], [start], [끝])
Buffer에서 지원하지 않는 인코딩 유형
Buffer.isEncoding(인코딩)을 사용하여 지원 여부를 확인하세요
iconv-lite: 순수 JavaScript 구현, 더 가벼운 무게, 더 나은 성능, C++에서 javascript로 변환할 필요 없음
iconv: C++ 호출 libiconv 라이브러리는
Buffers
"res.on('data', function(chunk) {})"의 접합을 완료합니다. 여기서 매개변수 청크는 Buffer 객체를 직접 사용합니다. + 스플라이싱을 하면 와이드 바이트 문자의 경우 왜곡된 문자가 생성될 수 있습니다.
해결책:
(1) 읽기 가능한 스트림의 setEncoding() 메서드를 통해 이 메서드를 사용하면 데이터를 만들 수 있습니다. 이벤트 전달은 더 이상 Buffer 객체가 아니지만 인코딩 그 이후의 문자열은 내부적으로 StringEncoder 모듈을 사용합니다.
(2) Buffer 객체를 임시로 배열에 저장하고 마지막으로 이를 큰 Buffer로 조립한 다음 출력용 문자열로 인코딩합니다.
버퍼는 파일 I/O 및 네트워크 I/O에 널리 사용되며 성능이 매우 중요하며 일반 문자열보다 성능이 훨씬 높습니다.
문자열 변환으로 인한 성능 손실 외에도 Buffer 사용에는 파일을 읽을 때 성능에 중요한 highWaterMark 설정이 있습니다.
a, highWaterMark 설정은 버퍼 메모리 할당 및 사용에 일정한 영향을 미칩니다.
b. highWaterMark 설정이 너무 작으면 시스템 호출이 너무 많이 발생할 수 있습니다.
버퍼를 사용해야 하는 경우와 사용하지 않는 경우 ------ 순수 자바스크립트는 유니코드 코드를 지원하지만 바이너리는 지원하지 않습니다. TCP 스트림이나 파일 스트림을 해결할 때 UTF-가 아닌 스트림을 처리해야 합니다. 8개의 문자열, 바이너리 및 기타 형식, "버퍼"를 사용해야 합니다.
인스턴스 소개
var buf = new Buffer("this is text concat test !") ,str = "this is text concat test !" ; console.time("buffer concat test !"); var list = [] ; var len = 100000 * buf.length ; for(var i=0;i<100000;i++){ list.push(buf) ; len += buf.length ; } var s1 = Buffer.concat(list, len).toString() ; console.timeEnd("buffer concat test !") ; console.time("string concat test !") ; var list = [] ; for (var i = 100000; i >= 0; i--) { list.push(str) ; } var s2 = list.join("") ; console.timeEnd("string concat test !") ;
실행 결과는 다음과 같습니다.
읽는 속도가 확실히 빨라지고, 버퍼에도 toString() 연산이 필요합니다. 따라서 문자열을 저장할 때 큰 문자열을 문자열로 연결하더라도 연결 속도는 버퍼의 속도보다 느리지 않습니다.
그럼 버퍼는 언제 다시 사용해야 할까요? 다른 방법이 없으면 UTF-8이 아닌 문자열, 바이너리 및 기타 형식을 저장할 때 이를 사용해야 합니다.
위 내용은 버퍼란 무엇입니까? Buffer 사용법과 구체적인 사용 시나리오 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!