언어 57

C#의 메모리 정렬 (StructLayout)

2021.04.18 - [이론/일반] - 객체 메모리, Object Alignment 객체 메모리, Object Alignment#include class AAA { private: int intA; int intB; double doubleA; }; class BBB { private: int intA; double doubleA; int intB; }; int main() { AAA a; BBB b; std::couttsyang.tistory.com 메모리 정렬 및 False Sharing에 대한 내용은 위 글 참고 StructLayout StructLayout 어트리뷰트를 struct/Class에 달아서 레이아웃을 지정해줄 수 있다. [StructLayout(LayoutKind.Sequentia..

언어/C# 2025.04.17

성능 측정 - DotnetBenchmark 퀵세팅

DotnetBenchmark 프로젝트에 설치하기프로젝트 폴더 (csproj있는 폴더)에다가 cmd를 켠다.다음을 입력한다 'dotnet add package BenchmarkDotNet' DotnetBenchmark 사용하기Build Configuration을 Release모드로 바꿔준다.Test할 메서드에 [Benchmark]어트리뷰트를 달아준다.메모리 사용량도 측정하고 싶다면 MemoryDiagnoser도 달아준다.[MemoryDiagnoser]public class SomeTest{ private const int TestSize = 1024; [Benchmark] public void TestAlloc() { var list = new List(); ..

언어/C# 2025.03.11

ValueTask / ValueTask<T>

이게 뭐고 왜 쓰나 이름처럼 ValueTask는 값(Value) 타입의 Task객체이다. 그렇다 Task는 참조 타입이다. 따라서 Task객체를 생성하는 것은 곧 힙 할당이 일어난다는 말이다. 그런데 Task들 중에서는 작업이 동기적으로 완료될 수 있는 애들이 있다. 즉 한 Task를 호출한 쓰레드가 그대로 이어서 다음 코드를 실행하는 것이다. private async Task GetData(int index){ if (_cachedData.TryGetValue(index, out var data)) return data; return await CalcSomethingLong(index);} 이를태면 위와 같은 메서드는 그 값이 이미 계산된 적이 있다면 즉시 값을 리턴한다. 이 ..

언어/C# 2024.05.02

Task.Delay (vs Thread.Sleep)

개요 Task.Delay를 통해 진행중인 Task를 일시정지 할 수 있다. public static async Task DoSomethingAsync() { await Task.Delay(100); //100ms 이상 대기한다. return Thread.CurrentThread.ManagedThreadId; } 이를 이용하여 소프트 타임아웃을 구현할 수 있다. public static async Task TaskWithSoftTimeout() { Task someTask = DoSomethingAsync(); var timeoutTask = Task.Delay(100); //둘 중 하나가 완료되길 대기 var completeTask = Task.WhenAny(someTask, timeoutTask); i..

언어/C# 2024.04.10

동시성 개요

개념 정리 동시성 : 한 번에 두 가지 이상의 작업을 수행 멀티스레딩 : 다수의 실행 스레드를 사용하는 동시성의 한 형태 병렬 처리 : 많은 작업을 여러 스레드에 나눠 수행하는 멀티스레딩의 한 형태 비동기 프로그래밍 : 불필요한 스레드의 사용을 피하기 위해 퓨처나 콜백을 사용하는 동시성의 한 형태 리액티브 프로그래밍 : 앱이 이벤트에 대응하는 방식 병렬 프로그래밍 병렬 프로그래밍은 데이터 병렬과 작업 병렬로 나눌 수 있다. 데이터 병렬 : 처리해야 할 데이터들을 다른 데이터들과 독립적으로 처리할 수 있을 때 해당된다. 작업 병렬 : 작업 풀에 있는 작업들이 다른 작업과 독립적일 때 해당. 모든 작업이 독립적이면 동기화가 필요 없어지므로 병렬 처리가 극대화된다. 스레드 풀 스레드 풀은 알아서 작업을 잘 처..

언어/C# 2024.04.01

struct 와 in, readonly

struct의 복사 비용 struct는 단독으로 사용하면 힙에 생성되지 않는다는 장점이 있다. 그대신 다른 메서드의 매개변수 등으로 주어질 때 항상 값 복사가 일어난다. 당연히 struct 내부에 필드가 많으면 많을수록 복사 비용이 커지게 된다. public struct SomeStruct { public int A, B, C; } public static bool IsZero(SomeStruct s) { return (s.A | s.B | s.C) == 0; } 가령 IsZero메서드를 호출하면 SomeStruct의 복사가 일어난다. 이를 방지하고 싶으면 ref키워드를 쓸 수 있다.ref키워드로 값 타입을 넘길 땐, 해당 타입 전체를 스택에 복사하는 대신 해당 타입의 주소만을 복사한다. public s..

언어/C# 2024.03.20

가비지 없이 foreach 사용하기

문제foreach문은 syntax sugar이다. 내부적으로 해당 타입의 Enumerator를 받아 루프를 수행한다. public class SomeGenericClass : IEnumerable{    public class SomeEnum : IEnumerator    {        public SomeEnum()        {            Console.WriteLine("Created");        }                public bool MoveNext()        {            return false;        }        public void Reset()        {            throw new NotImplementedExcepti..

언어/C# 2024.01.21

Dynamic 타입

Dynamic 리플렉션이나 다른 구성요소와 통신하는 일을 더 쉽게할 수 있도록 C# 컴파일러는 표현식의 타입을 dynamic으로 선언할 수 있게 했다. 만약 코드에서 dynamic으로 표시된 표현식이나 멤버를 호출하는 코드를 작성하면, 컴파일러는 페이로드(Payload)라 불리는 특별한 IL 코드를 생성한다. 실행 시점에서 페이로드 코드는 객체의 실제 타입을 기반으로 정확한 연산을 찾아 실행하는 일을 한다. public class Cat { public void Speak() { Console.WriteLine("Meow"); } } public class Dog { public void Speak() { Console.WriteLine("Woof"); } } public class Rock { } //..

언어/C# 2024.01.14

CLR? .NET? Mono?

선 정리 CTS, CLS는 닷넷 호환 언어가 지켜야하는 규약 닷넷 호환 언어는 CIL을 만들어낸다. CIL을 가지고 어떡할지에 대한 규격이 CLI CLI를 구현한 것이 CLR, Mono 닷넷 코어, 닷넷 프레임워크 등은 CLI 구현체 (ex. CLR)을 포함하고 추가적인 기능 제공 CIL CIL(Common Intermediate Language)는 그냥 IL이라고도 쓴다. IL코드는 CPU에 독립적인 결과물이다. 닷넷 호환 언어들은 소스코드를 IL로 컴파일하고, CLR같은 애들이 IL 코드를 CPU기계어로 최종 번역한다. . CTS CTS(Common Type System)는 닷넷 호환 언어가 뭘 구현할 수 있느냐를 정의한 규격. 가령 CTS에서는 다중 상속을 지원하지 않기 때문에 CTS를 만족하는 언..

언어/C# 2023.10.01