개요 흔히 면접 준비 때 박싱에 대해서 공부하게 된다. 하지만 실무에서는 거의 대부분 고려할 일이 없어서 시간이 지날수록 왜곡된 기억과 함께 여러 오해가 생기게 되었는데 관련해서 정리하려 한다. 박싱에 대하여 Stack에 있던 값을 Heap으로 옮기는 작업. 스택에 있는 값을 Heap으로 옮기면서, Heap에 메모리 할당, 값 복사가 일어나서 느리다. 더 자세한 내용은 구글에 C# 박싱을 검색.... int a = 5; object boxedA = a; Dictinary의 Key로 enum을 사용하면 안 되는가? .Net 4.0부터 Dictinary가 개선되어서 문제가 없어졌다. 이전에는 Dictinary 내부에서 Equal 함수를 사용하는데 이때, Enum 간 Equal 체크 시에 박싱이 일어나는 문제..
개요 MSSQL에서 스키마를 다량으로 추가/수정하는 쿼리를 테스트하려고 [BEGIN TRAN]-[ROLLBACK TRAN]을 걸고 테스트하는 도중, [ROLLBACK TRAN]이 씹히고 스키마가 모조리 변경되는 대참사가 발생한 이슈가 있어서 기록 및 제대로 이해하려는 목적으로 포스팅을 한다. GO를 사용하지 않는 트랜잭션 BEGIN TRAN SELECT @@TRANCOUNT -- : 1 CREATE TABLE [dbo].[TEST1] -- 추후에 롤백됨. ( [id] INT ); CREATE TABLE [dbo].[TEST1] -- 중복 생성으로 인한 에러가 발생하고, 트랜잭션이 롤백된 채로 이후 모든 명령어가 무시된다. ( [id] INT ); SELECT @@TRANCOUNT -- : 출력되지 않는다..
MSSQL에서 데드락 그래프를 뽑는 방법을 기록한다. 1. SSMS를 이미 설치해 놨다면, 아마도 깔려 있을 SQL Server Profiler 18을 실행한다. 2. [파일] -> [새 추적]을 누른다. 3. 접속 정보를 확인하고 연결 한다. 4. [이벤트 선택] -> [Locks] -> [Deadlock graph]를 체크한 다음 [실행]을 누른다. 5. 아래와 같이 창이 떴다면 이제 데드락을 일으켜 보자. -- 테스트 테이블 세팅 CREATE TABLE Test1 ( uid BIGINT, item1 Varchar(10), item2 Varchar(10), item3 Varchar(10), CONSTRAINT PK_TEST1 PRIMARY KEY (uid) ) GO INSERT INTO dbo.Tes..
작업 중에 MSSQL에서 현재 데이터가 어떤 페이지(물리적 페이지)에 있는지 알아야 하는 일이 있었는데, 그때 사용한 쿼리들을 정리하였다. 1. 테이블의 Page 현황 조사 쿼리 SELECT DB_NAME(PA.database_id) [DataBase], OBJECT_NAME(PA.object_id) [Table], SI.Name [Index], is_allocated, allocated_page_file_id [file_id], allocated_page_page_id [page_id], page_type_desc, page_level, previous_page_page_id [previous_page_id], next_page_page_id [next_page_id] FROM sys.dm_db_dat..
MSSQL에서 row을 임의로 삽입할 때, 가장 쉽게 생각할 수 있는 루프 문을 사용하는 방법으로 하면 몇천만 건씩 넣을 경우 매우 매우 느리다. 그래서 아래와 같은 방법으로 쿼리를 넣으면 꽤나 대량의 row도 순식간에 넣을 수 있다. -- 1000000 개의 순차적인 uid의 row를 넣는 쿼리. INSERT INTO [dbo].[Test1] SELECT TOP (1000000) Id = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id])), 1, 2, 3 FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
개요 static 멤버 함수를 어떨 때 사용하면 좋은지 공유하기 위하여 포스팅하였다. 일반적인 사용처 class TestClass { private static int initCount = 0; public TestClass() { Interlocked.Increment(ref initCount); } public static void PrintInitCount() { Console.WriteLine(initCount); } } TestClass.PrintInitCount(); 제일 많이 쓰는 방법. 한 클래스의 범 인스턴스적으로 공용하여 쓰는 static 멤버 변수를 외부 클래스에서 사용하거나 해야 할 때 위와 같이 static 멤버 변수를 많이 쓴다. this를 사용하지 않는 멤버 함수 알리기 cla..
개요 전에는 그냥 대충 [Async 함수를 호출하면 ThreadPool에서 Task를 하나 꺼내서 함수를 던져주겠지~]라고 생각했었다. 하지만 현실은 물론 그렇지 않았으며, 내부에서 신기하고 재미있는 일이 일어나고 있어서 포스팅을 남기려 한다. 예제 static class DBExecutor { static public async Task ExecuteDB(string spName, long accountId) { string result; Console.WriteLine($"DB 연결 시작"); await Task.Delay(2000); Console.WriteLine($"{spName} 호출 시작."); await Task.Delay(2000); Console.WriteLine($"{spName} 호..
Item에 대한 속성(버리기 가능, 사용 가능, 장착 가능, 강화 가능)을 하나의 변수에다가 담고 싶다. 그럴땐 Enum을 사용하여 Flag 연산을 통해 작업을 하는 것이 편하고 싸다. 이렇게 Enum을 정의하여 나는 포션이라는 타입에다가 Deletable과 Usable 속성을 합쳐서 하나의 변수에 담을 수 있게 되었다. 플래그를 꺼내서 사용할 때에는 위와 같은 방식으로 사용하는게 예쁘다. 여기서 궁금한 내용이 ~0가 뭔가? 싶었는데, 물결표 연산자는 이진수 값을 모두 뒤집은 것. 즉 0의 이진수 값은 00000000..인데 이를 뒤집은 뒤집은 11111111... 이며 값은 -1이다. 그래서 모든 Flag 연산에 or을 걸어도 True를 내뱉을 수 있는 All로써 제격인 값. 다른 방법으로는 Int.M..
개요 개발 중 퍼포먼스 측정을 위하여 소요 시간을 아주 잦게 해야하는 로직이 있었다. 이때 제일 익숙하게 사용하는 DateTime.Now를 사용하면 느리지 않을까 싶어서 알아 보았다. 요약 DateTime.Now > StopWatch > DateTime.UtcNow 순으로 무거우니 빠른 계산은 UtcNow를 사용하고, 정밀 계산이 필요하면 StopWatch를 사용하자. 내용 1. DateTime.UtcNow UtcNow쪽을 살펴보면 단순히 SystemTime을 가져오는 것이 전부 인것으로 보인다. 2. StopWatch StopWatch는 HighResoulution이 켜져있다면 좀 더 무겁고 정밀한 계산을 하고, 그게 아니라면 위의 UtcNow를 사용한다. 하지만 대부분의 경우 QPC가 깔려있어서 QP..