출력."/> 출력.">

 >  기사  >  백엔드 개발  >  Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇입니까?

Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇입니까?

王林
王林앞으로
2024-02-09 21:30:24862검색

为什么 Go 中读写文件比 Perl 慢很多?

Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇인가요? 이는 두 프로그래밍 언어를 사용할 때 많은 개발자가 직면하는 일반적인 문제입니다. 이 기사에서는 PHP 편집자 Strawberry가 이 질문에 답해 줄 것입니다. Go와 Perl 간의 파일 읽기 및 쓰기 속도를 비교할 때 언어 기능과 기본 구현이라는 두 가지 핵심 요소를 고려해야 합니다. 파일 읽기 및 쓰기 측면에서 Go 언어의 디자인 철학은 Perl과 다르며 이는 성능의 차이로 이어집니다. 동시에 기본 구현도 읽기 및 쓰기 속도에 영향을 미치는 중요한 요소입니다. 다음으로 Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유를 더 잘 이해할 수 있도록 이러한 요소를 자세히 분석하겠습니다.

질문 내용

코드 효율성을 높이기 위해 go를 사용하는데, 파일을 읽고 쓸 때 go를 사용하면 읽기 및 쓰기 효율성이 Perl만큼 높지 않다는 것을 알았습니다. 내 코드에 문제가 있나요? 아니면 다른 이유가 있나요?

빌드 입력 파일:

으아아아

perl을 사용하여 파일 읽기 및 쓰기:

으아아아 으아아아

go를 사용하여 파일을 읽고 쓰세요:

으아아아

그런 다음 다음을 실행합니다.

으아아아 으아아아

go의 읽기 및 쓰기 속도가 Perl보다 거의 10배 느린 이유는 무엇입니까?

해결책

당신은 사과를 오렌지와 비교하고 있습니다.

적어도 두 가지 방법 오류가 있습니다:

  1. Perl 주문 측정 cat 如何读取文件并通过 pipe(2) 发送其内容,而 perl은 거기에서 데이터를 읽고 처리한 후 결과를 표준 출력에 씁니다.

  2. Go 주문

    • go 툴체인의 전체 빌드 프로세스를 측정합니다(실행 가능한 이미지 파일 컴파일, 링크 및 작성 포함) 그런 다음 실행 컴파일된 프로그램의 구성 요소 및
    • 버퍼링되지 않은 stdout 쓰기(fmt.print* 호출)를 측정하는 반면, perl 코드에서 stdout에 쓰기는 docs 인용 - "출력이 터미널에 대한 경우 일반적으로 라인 버퍼링이 가능하고, 그렇지 않으면 블록 버퍼링이 가능합니다."
  3. 사과를 사과와 비교해 봅시다.

먼저 유사한 Go 구현은 다음과 같습니다.

으아아아

로 저장하고 측정해 보세요:

chomp.go

    빌드 코드:
  1. $ go build chomp.go

  2. 입력 파일 생성:
  3. $ for i in $(seq 1 600000);执行 echo server$((random%800+100)),$random,$random,$random;完成 >sample.csv

  4. 펄 코드 실행:
  5. 으아아아

  6. 다시 실행하여 파일 시스템 캐시에서 입력 파일을 읽었는지 확인하세요.
  7. 으아아아

    실행 시간이 어떻게 단축되는지 확인하세요.

  8. 캐시된 입력에 대해 go 코드 실행:
  9. 으아아아

  10. 결과가 동일한지 확인하세요.
  11. $ cmp out1.txt out2.txt

  12. 보시다시피 SSD가 장착된 내
시스템에서는 결과가 거의 동일합니다.

linux/amd64합리적인 결과를 얻으려면 각 명령을 1000번 실행하고 각 배치의 결과를 평균화한 다음 숫자를 비교해야 한다는 점도 지적하고 싶습니다. 하지만 이 방법만으로도 문제가 무엇인지 증명하기에 충분하다고 생각합니다. 이다.

한 가지 더 고려해야 할 사항: 이 두 프로그램의 실행 시간은 파일 시스템 I/O에 의해 압도적으로 지배되므로 Go가 더 빠를 것이라고 생각한다면 기대는 근거가 없습니다. 이 두 프로그램은 시간의 일부

sleep

커널 시스템은 read(2) write(2)를 호출합니다. ). Go 프로그램은 CPU 작업과 관련된 일부 경우(특히 멀티 코어 시스템을 활용하도록 작성된 경우) Perl 프로그램보다 빠를 수 있지만 예제에서는 전혀 그렇지 않습니다. read(2)write(2) 아, 언급되지 않은 사실을 분명히 하자면, go 언어 사양에는

aot

이 없고 go run은 일회성 일회성 공연을 위한 해킹이지만 아님 심각한 작업을 수행하지 않으며 심각하게 복잡한 코드를 실행하지도 않습니다. 간단히 말해서, 사용 중인 go-that-you-are는 해석된 언어가 아니지만 go run의 가용성으로 인해 그렇게 보일 수 있습니다. 실제로 이는 일반적인 go build가 수행하는 작업을 수행한 다음 결과 실행 파일을 실행한 다음 삭제합니다. go run 是一种针对一次性一次性演出的 hack,严肃的工作,也不执行任何严重复杂程度的代码。简而言之,go-that-you-are-using 并不是一种解释性语言,尽管 go run 的可用性可能使它看起来如此。事实上,它执行正常 go build

Perl도 "소스 코드"를 처리한다고 말하고 싶을 수도 있지만 Perl 인터프리터는 스크립트 및 go의 빌드 툴체인을 처리하는 데 고도로 최적화되어 있지만 대부분의 다른 컴파일 언어에 비해 놀라울 정도로 빠르지만 이를 위해 설계되지 않았습니다. 최적화되었습니다.
아마도 더 분명한 차이점은 Perl 인터프리터가 실제로 (매우 간단한) 스크립트를 해석하는 반면, chompprint 是所谓的“内置函数”,很容易提供给由解释器执行脚本。与构建 go 程序相比,编译器解析源代码文件并将其转换为机器代码,链接器实际上读取 go 标准库的编译包的文件 - 所有这些都是 imported, - 从它们,组合所有这些机器代码并写出一个可执行图像文件(这很像 perl바이너리 자체라는 것입니다! ) 물론 이는 리소스를 많이 소모하는 프로세스이며 실제 프로그램 실행과는 아무런 관련이 없습니다.

위 내용은 Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제