Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇입니까?
Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇인가요? 이는 두 프로그래밍 언어를 사용할 때 많은 개발자가 직면하는 일반적인 문제입니다. 이 기사에서는 PHP 편집자 Strawberry가 이 질문에 답해 줄 것입니다. Go와 Perl 간의 파일 읽기 및 쓰기 속도를 비교할 때 언어 기능과 기본 구현이라는 두 가지 핵심 요소를 고려해야 합니다. 파일 읽기 및 쓰기 측면에서 Go 언어의 디자인 철학은 Perl과 다르며 이는 성능의 차이로 이어집니다. 동시에 기본 구현도 읽기 및 쓰기 속도에 영향을 미치는 중요한 요소입니다. 다음으로 Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유를 더 잘 이해할 수 있도록 이러한 요소를 자세히 분석하겠습니다.
질문 내용
코드 효율성을 높이기 위해 go를 사용하는데, 파일을 읽고 쓸 때 go를 사용하면 읽기 및 쓰기 효율성이 Perl만큼 높지 않다는 것을 알았습니다. 내 코드에 문제가 있나요? 아니면 다른 이유가 있나요?
빌드 입력 파일:
으아아아perl을 사용하여 파일 읽기 및 쓰기:
으아아아 으아아아go를 사용하여 파일을 읽고 쓰세요:
으아아아그런 다음 다음을 실행합니다.
으아아아 으아아아go의 읽기 및 쓰기 속도가 Perl보다 거의 10배 느린 이유는 무엇입니까?
해결책
당신은 사과를 오렌지와 비교하고 있습니다.
적어도 두 가지 방법 오류가 있습니다:
-
Perl 주문 측정
cat
如何读取文件并通过pipe(2) 发送其内容
,而perl
은 거기에서 데이터를 읽고 처리한 후 결과를 표준 출력에 씁니다. -
Go 주문
- go 툴체인의 전체 빌드 프로세스를 측정합니다(실행 가능한 이미지 파일 컴파일, 링크 및 작성 포함) 그런 다음 실행 컴파일된 프로그램의 구성 요소 및
- 버퍼링되지 않은 stdout 쓰기(
fmt.print*
호출)를 측정하는 반면, perl 코드에서 stdout에 쓰기는 docs 인용 - "출력이 터미널에 대한 경우 일반적으로 라인 버퍼링이 가능하고, 그렇지 않으면 블록 버퍼링이 가능합니다."
사과를 사과와 비교해 봅시다.
먼저 유사한 Go 구현은 다음과 같습니다.
으아아아로 저장하고 측정해 보세요:
chomp.go
- 빌드 코드:
-
$ go build chomp.go
입력 파일 생성: -
$ for i in $(seq 1 600000);执行 echo server$((random%800+100)),$random,$random,$random;完成 >sample.csv
펄 코드 실행: -
으아아아
-
으아아아
실행 시간이 어떻게 단축되는지 확인하세요.
캐시된 입력에 대해 go 코드 실행: -
으아아아
-
$ cmp out1.txt out2.txt
보시다시피 SSD가 장착된 내
linux/amd64
합리적인 결과를 얻으려면 각 명령을 1000번 실행하고 각 배치의 결과를 평균화한 다음 숫자를 비교해야 한다는 점도 지적하고 싶습니다. 하지만 이 방법만으로도 문제가 무엇인지 증명하기에 충분하다고 생각합니다. 이다.
한 가지 더 고려해야 할 사항: 이 두 프로그램의 실행 시간은 파일 시스템 I/O에 의해 압도적으로 지배되므로 Go가 더 빠를 것이라고 생각한다면 기대는 근거가 없습니다. 이 두 프로그램은 시간의 일부
sleep 커널 시스템은 read(2)
및 write(2)를 호출합니다. )
. Go 프로그램은 CPU 작업과 관련된 일부 경우(특히 멀티 코어 시스템을 활용하도록 작성된 경우) Perl 프로그램보다 빠를 수 있지만 예제에서는 전혀 그렇지 않습니다. read(2)
和 write(2)
아, 언급되지 않은 사실을 분명히 하자면, go 언어 사양에는
이 없고 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 인터프리터가 실제로 (매우 간단한) 스크립트를 해석하는 반면, chomp
和 print
是所谓的“内置函数”,很容易提供给由解释器执行脚本。与构建 go 程序相比,编译器解析源代码文件并将其转换为机器代码,链接器实际上读取 go 标准库的编译包的文件 - 所有这些都是 import
ed, - 从它们,组合所有这些机器代码并写出一个可执行图像文件(这很像 perl
바이너리 자체라는 것입니다! ) 물론 이는 리소스를 많이 소모하는 프로세스이며 실제 프로그램 실행과는 아무런 관련이 없습니다.
위 내용은 Go에서 파일을 읽고 쓰는 것이 Perl보다 훨씬 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C++에서 절대값을 얻는 방법에는 두 가지가 있습니다: 1. 내장 함수인 abs()를 사용하여 정수 또는 부동 소수점 유형의 절대값을 얻습니다. 2. 일반 함수 std::abs()를 사용하여 지원되는 다양한 절대값을 얻습니다. 데이터 유형의 절대값에 대해 작동합니다.

std는 표준 라이브러리의 구성 요소를 포함하는 C++의 네임스페이스입니다. std를 사용하려면 "usingnamespace std;"문을 사용하세요. std 네임스페이스에서 직접 기호를 사용하면 코드가 단순화될 수 있지만 네임스페이스 오염을 방지하기 위해 필요한 경우에만 권장됩니다.

Python에서 팝업을 생성하는 방법에는 두 가지가 있습니다: Tkinter: Tkinter 라이브러리를 사용하여 Tk 또는 TopLevel 위젯을 생성합니다. Pyglet: Pyglet 라이브러리를 사용하여 창 창을 만듭니다.

prime은 C++에서 소수 유형을 나타내는 키워드로, 1과 자기 자신으로만 나눌 수 있습니다. 주어진 값이 소수인지 여부를 나타내는 Boolean 유형으로 사용됩니다. 참이고, 그렇지 않으면 거짓입니다.

fabs() 함수는 부동 소수점 숫자의 절대값을 계산하고 음수 부호를 제거한 후 양수 값을 반환하는 C++의 수학 함수입니다. 부동 소수점 매개변수를 허용하고 double 유형의 절대값을 반환합니다. 예를 들어, fabs(-5.5)는 5.5를 반환합니다. 이 함수는 부동 소수점 숫자와 함께 작동하며 그 정확도는 기본 하드웨어에 의해 영향을 받습니다.

구성 정보는 Java로 구성되며 애플리케이션 동작을 조정하는 데 사용됩니다. 일반적으로 외부 파일이나 데이터베이스에 저장되며 Java 속성, PropertyResourceBundle, Java 구성 프레임워크 또는 타사 라이브러리를 통해 관리할 수 있습니다. 환경 인식, 관리 용이성, 확장성.

복소수 유형은 C 언어에서 실수부와 허수부를 포함하는 복소수를 나타내는 데 사용됩니다. 초기화 형태는 complex_number = 3.14 + 2.71i 이며 실수부분은 creal(complex_number)를 통해, 허수부분은 cimag(complex_number)를 통해 접근할 수 있습니다. 이 유형은 덧셈, 뺄셈, 곱셈, 나눗셈 및 모듈로와 같은 일반적인 수학 연산을 지원합니다. 또한 cpow, csqrt, cexp 및 csin과 같은 복소수 작업을 위한 함수 세트가 제공됩니다.

C++의 min 함수는 여러 값 중 최소값을 반환합니다. 구문은 min(a, b)입니다. 여기서 a와 b는 비교할 값입니다. < 연산자를 지원하지 않는 유형을 지원하도록 비교 함수를 지정할 수도 있습니다. C++20에는 최소 3개 이상의 값을 처리하는 std::clamp 함수가 도입되었습니다.
