본문 바로가기

전체 글80

[Effective Kotlin] 52 - mutable 컬렉션 사용을 고려하라 immutable 컬렉션보다 mutable 컬렉션이 좋은 점은 성능적 측면에서 더 빠르다는 것입니다. immutable 컬렉션에 요소를 추가하려면, 새로운 컬렉션이 만들어지면서 여기에 요소를 추가해야 합니다. 이처럼 컬렉션을 복제하는 처리는 비용이 굉장히 많이 드는 처리입니다. 그래서 이러한 복제 처리를 하지 않는 mutable 컬렉션이 성능적 관점에서 좋습니다. 다만, '아이템 1: 가변성을 제한하라'에서 언급했던 것처럼 immutable컬렉션은 안전하다는 측면에서 좋습니다. 하지만 일반적인 지역 변수는 이때 언급했던 문제가 될 수 있는 경우(동기화와 캡슐화)에 해당되지 않습니다. 따라서 지역 변수로 사용할 때는 mutable 컬렉션을 사용하는 것이 더 합리적입니다. 그래서 표준 라이브러리도 내부적으로.. 2024. 1. 21.
[Effective Kotlin] 51 - 성능이 중요한 부분에는 기본 자료형 배열을 사용하라 Kotlin은 기본 자료형을 선언할 수 없지만, 최적화를 위해서 내부적으로 사용할 수 있습니다. 이전 45: 불필요한 객체 생성을 피하라에서 언급했던 것처럼 기본 자료형은 다음과 같은 특징이 있습니다. 일반적인 객체와 다르게 추가적으로 포함되는 것들이 없기 때문에 가볍습니다. 값에 접근할 때 추가 비용이 들어가지 않기 때문에 빠릅니다. 따라서 대규모 데이터를 처리할 때 기본 자료형을 사용하면, 상당히 큰 최적화가 이루어집니다. 그런데 코틀린에서 사용되는 List와 Set 등의 컬렌션은 제네릭 타입입니다. 제네릭 타입에는 기본 자료형을 사용할 수 없으므로, 랩핑된 타입을 사용해야 합니다. 일반적인 경우에는 이렇게 하는 것이 훨씬 더 처리하기 쉬워지므로 적합합니다. 하지만 성능이 중요한 코드라면 IntArr.. 2024. 1. 14.
[CppCon] compile-time polymorphism에 대해 이번 글은 최근에 흥미롭게 시청한 2022년 CppCon의 "Using Modern C++ to Eliminate Virtual Functions - Jonathan Gopel"을을 기반으로 작성하게 되었습니다. 그런데 모든 내용을 다루지는 않고 이 영상에서 핵심이 되는 내용인 virtual를 사용하지 않고 다형성을 어떻게 구현하는지에 대해서 코드와 함께 이야기해 볼 예정입니다. 전체적인 내용이 궁금하시다 위의 링크에서 시청해 보시기 바랍니다. 아래의 코드는 일반적인 virtual을 사용해서 Binding interface를 하는 경우입니다. struct FooInterface { [[nodiscard]] virtual auto foo() const -> int = 0; }; struct Foo fina.. 2024. 1. 13.
[Effective Kotlin] 50 - 컬렉션 처리 단계 수를 제한하라 모든 컬렉션 처리 메서드는 비용이 많이 듭니다. 표준 컬렉션 처리는 내부적으로 요소들을 활용해 반복을 돌며, 내부적으로 계산을 위해 추가적인 컬렉션을 만들어 사용합니다. 시퀀스 처리도 시퀀스 전체를 랩하는 객체가 만들어지며, 조작을 위해서 또 다른 추가적인 객체를 만들어 냅니다. 두 처리 모두 요소의 수가 많다면, 꽤 큰 비용이 들어갑니다. 따라서 적절한 메서드를 활용해서, 컬렉션 처리 단계 수를 적절하게 제한하는 것이 좋습니다. class Student(val name: String?) // 작동은 합니다. fun List.getNames(): List = this .map { it.name } .filter { it != null } .map { it!! } // 더 좋습니다. fun List.get.. 2024. 1. 7.