Kotlin/Native 대 C++ 대 Freepascal 대 Python: 비교
코드베이스에서 빌드 시간, 실행 시간, 컴파일된 실행 파일 크기 측정

여러분, 안녕하세요! Google이 Android 개발 및 Jetpack 제품군이라는 Google 자체 라이브러리를 위한 주요 프로그래밍 언어로 Kotlin을 발표한 이후로 이 언어의 채택이 비약적으로 증가했습니다.
그러나 Kotlin은 Android 전용이 아닙니다. 또한 백엔드, 다중 플랫폼 데스크탑 앱, 데이터 과학, 게임, 프론트엔드 및 머신 러닝을 위한 것입니다.
Kotlin을 사용하면 매우 광범위한 목표에 도달할 수 있습니다. 연고에는 단지 하나의 작은 파리가 있습니다. 릴리스를 배포하려면 코드와 함께 전체 Java 가상 머신을 가져와야 합니다. 하지만 Kotlin/Native는 어떻게 될까요? 다양한 애플리케이션을 구축할 준비가 되었습니까? C++와 같은 다른 언어와 성능이 비슷합니까?
이 블로그 게시물 시리즈에서는 진실을 찾고 Kotlin/Native를 C++, 고대 Freepascal 및 Python과 비교하려고 합니다.
하지만 잠깐만요. 왜 파이썬인가요? Python 코드는 기본 앱으로 컴파일되지 않습니다. 그런데 왜 여기에 있습니까? 흠, 아마도 재미를 위해 또는 내가 그것에 익숙하기 때문에).
- 기본 앱으로 간단한 수학, 아니면 오늘 밤 누가 그렇게 똑똑할까요? — 당신은 여기에 있습니다 —
- SDL2를 사용한 그래픽 테스트 또는 Norton Commander를 사용한 Across the Universe.
코틀린
Wiki에 따르면 Eratosthenes의 체는 컴퓨터 성능을 벤치마킹하는 인기 있는 방법입니다. 말 그대로 우리에게 필요한 것입니다. 네이티브 코드를 생성할 수 있는 다양한 프로그래밍 언어에 대한 콘테스트를 시작하고 이를 타고난 수학 전문가인 Mr. Python과 비교하겠습니다.
다른 사람들을 위한 패턴으로 Kotlin에서 다음 코드를 작성했습니다.
나는 여기를 사용했다 require
전제 조건을 정의하는 함수입니다. 우리도 가지고있다 contracts
Kotlin에서 함수의 일부 동작을 지정합니다. 물론 우리는 assertions
하지만 테스트 스위트에서 사용하는 것이 더 낫다고 생각합니다.
Kotlin 확장 기능이 얼마나 유용한지 보세요. 나는 여기를 사용했다 mapIndexedNotNull
에 대한 술어로 takeIf
확대. 말 그대로 기능적 스타일의 한 줄의 코드는 루프를 목록 작성 및 조건으로 대체합니다.
그리고 나는 사용했다 Array
대신에 mutableList
여기서는 속도와 메모리 절약을 위해 배열의 값이 반복될 때마다 변경됩니다. 동안-loop, 여기서 배열이 선호되는 이유는 각 단계에서 새 메모리 세그먼트를 할당하지 않고 값을 매우 빠르게 변경합니다. 이 구조는 밖으로 나오지 않습니다 기능 범위 어레이를 사용하는 것은 완전히 안전합니다.
오, 위에 체리를 잊지 마세요! 그만큼 measuredTimeMills
상자에서 기능. 고마워요, Kotlin/Native.
파이썬
여태까지는 그런대로 잘됐다. 다음으로 우리가 흥분시킬 것은 Python입니다. 그들의 구문 설탕을 비교해 보겠습니다.
보시다시피 Python 코드와 Kotlin 코드의 논리와 구문은 거의 동일합니다. 나는 사용했다 assert
전제 조건의 경우 초기 부울 배열 구축을 위한 목록 이해와 소수 목록을 반환했습니다. 파이썬은 상자에서 시간을 측정하는 기능이 없지만 시녀와 함께 더 나은 방법을 얻었습니다. decorator
measured_time
.
나는 어떤 설탕을 선호합니까? 한편으로 Kotlin은 모든 유형에 대한 강력한 확장 기능을 가지고 있으며 원하는 대로 결합하고 결과에서 아름다운 기능 체인을 얻을 수 있습니다.
다른 한편으로, 파이썬은 목록 이해를 위한 가장 간결한 구문을 가지고 있지만 가장 성가신 조건도 가지고 있습니다. 저는 if… else… if… else… 그런데 Python 3.10에서 제공되는 완전히 새로운 패턴 매칭은 when
Kotlin의 구문.
C++
가장 무서운 C++에서 동일한 알고리즘이 작동하도록 하는 방법을 기억하기 위해 내 마음의 궁전의 맨 아래 부분에 도착해야 했습니다.
물론 알고리즘 자체는 여전히 동일하며 다른 C 계열 프로그래밍 언어와 구문도 유사합니다.
그러나 메모리 할당, 메모리 해제 및 이러한 모든 포인터, 링크 등의 모든 세부 사항에 주의를 기울여야 합니다.
여전히 C++ 템플릿과 람다를 사용하여 고차 함수를 직접 키울 수 있지만 이는 매우 고통스럽고 C++의 모든 성능 소품을 손상시킵니다.
예를 들어, 포인터 대신 함수의 결과로 값 인수로 목록을 사용하면 각 백만 소수에 100밀리초가 추가됩니다.
옛날 옛적에... 먼 은하계에서... 전 세계의 모든 학생이 파스칼을 배우고 있었습니다. 현재 Delphi(현재 이름이 무엇입니까?)와 Lazarus IDE를 유지 관리하는 수백만 명의 수염 난 코더를 보유한 Pascal에게 경의를 표해야 한다고 생각합니다. 메모장 아마추어와 vim'ers는 최신 자동 완성이나 코드 제안 없이 Lazarus IDE의 Spartan 이점을 이해해야 합니다.
파스칼 코드는 가장 긴 코드입니다. 그것은 제네릭을 가지고 있지만, 보시다시피, 그들은 그것을 복잡하게 만들었습니다. (왜 specialize
? 이 말은 무엇을 위한 말입니까?)
파스칼은 여전히 고차 함수와 람다의 기회가 없습니다. 예, 인수에 대한 기능적 유형이 있지만... 이 방법을 직접 전달해야 합니다.
우리가 이 대회에서 어떤 결과를 얻을 것이라고 생각합니까? 빌드 시간, 실행 시간, 컴파일된 실행 파일의 크기를 측정했고 100,000,000 소수 중 첫 번째 소수를 계산한 다음과 같은 결과를 얻었습니다.

С++는 가장 빠른 실행과 가장 작은 응용 프로그램이라는 제목에 걸맞게 작동합니다. 하지만 파스칼은 숨을 헐떡이고 있습니다!
Kotlin/Native 파일은 Pascal 파일의 절반 크기이지만 절반도 뒤쳐집니다. 그리고 파이썬은 어떻게 될까요? 왜 이렇게 느립니까? 미리 컴파일된 라이브러리를 사용하지 않고 코드의 각 줄만 해석하기 때문입니다.
나는 함수형 프로그래밍 파워 클럽에 가입하고 표현력 있고 간결한 코드를 가지고 있는 Kotlin 코드에 5점을 줍니다.
그리고 2위는 Python입니다. 내 생각에는 C++ 코드가 Pascal의 코드보다 더 아름답습니다. 그러나 제가 몇 년 동안 아주 즐겁게 사용했다는 사실을 잊지 마십시오.
콘테스트의 두 번째 부분에서는 그래픽 테스트에서 다음 언어를 비교할 것입니다. SDL2
Norton Commander의 starfield로 라이브러리를 만들고 오래된 화면 보호기를 만드십시오. 이 테스트는 Vyacheslav Arkhipov의 이 게시물에서 영감을 받았습니다.
계속 지켜봐 주세요. 다시 돌아올게요.
'Coding' 카테고리의 다른 글
맞춤형 Paint Flutter 앱 위젯 빌드하는 방법 (0) | 2022.05.02 |
---|---|
BP의 Daily Digest #16 — URL, iMessage, 람다 콜드 스타트 등 분석 (0) | 2022.05.01 |
Python에서 setup.py 파일을 사용하여 코드 공유하는 방법 (0) | 2022.04.28 |
Flutter 프리즈드 패키지 사용하는 방법 (0) | 2022.04.26 |
유형 자리 표시자: 새로운 Swift 5.6 기능 살펴보기 (0) | 2022.04.22 |