아래 링크에 소개되고 있다.
http://www.c-sharpcorner.com/UploadFile/john_charles/984/

점점 자바스크립트와 비슷해 진다...
var 키워드를 쓰는 경우는 컴파일 타임에 형이 정해지는 반면 dynamic 인 경우는 런타임에 형이 결정된다는 점이 다른 듯 하다.
  즉 var 키워드를 쓰는 경우는 커파일시 오류가 검출되지만 dynamic 인 경우는 런타임시에 오류가 발견된다...더 위험하다..하지만 더 유연하다.
아마도 함수형 언어도 닷넷프레임웍 랭귀지로 쓸수있께 하려고 추가한 기능인듯.
앞으로 쓸일을 별로 없겠다.

함수 파라미터에 기본값을 지정하는 기능은 좋은 것 같다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSharpNewFeatures
{
    class Program
    {
        public static void Method(int age, String firstname="John", double salary=4000.99)
        { }
        static void Main(string[] args)
        {
            Method(30); //The same as Method(30,"John",4000.99)
            Method(30, "Mary"); //The same as Method(30,"Mary",4000.99)
            Method(30, "Mary", 2000.99);
        }
    }
}



이렇게 되면 오버로딩 코드를 여러개 안짜도 되지 않을까.

게다가 파라미터 순서를 꼭 안지켜도 된다고한다.
아래처럼..
namespace CSharpNewFeatures
{
    class Program
    {
        public static void Method(int age, String firstname="John", double salary=4000.99)
        { }
        static void Main(string[] args)
        {
            Method(30, salary:2000.9); //파라미터 매핑
        }
    }
}

이건 좋다...ㅎㅎ
신고

'DotNet' 카테고리의 다른 글

리소스 사용하기(삽질기)  (1) 2010.05.24
[링크]AOP  (2) 2010.05.17
C# 4.0 에 추가된 기능들  (0) 2010.04.30
VS2010 beta2 동영상  (0) 2010.01.28
Webdav 서버에 있는 오피스 파일 수정하기  (0) 2010.01.07
C# 에서 파일에 lock 걸기  (0) 2009.12.29

댓글을 달아 주세요

사이트 튜닝과 개발자들의 개발 편의성을 위해  새로운 script  태그(사용자 지정 컨트롤)을 하나 만들었다.

시나리오대로 라면 expires 해더를 통해 스크립트가 브라우저 캐시가 되어야 하고 만료일 전까지는 Request를 보내지 않아야 한다.

fiddler 로 조사해 보니 해더에 분명히 expires 해더가 붙었는데도...이 놈이 요청을 보낸다.
브라우저의 캐시 폴더에 캐시가 저장되어있는데도 말이다....오 이런일이..왜 그런 것일까.

혹시 몰라 우선 304 리턴 부분을 만들어 두었다. 브라우저 캐시가 안된다면 304 라도 처리해야 체면이 선다.

Last-modified 해더와  Etag 도 설정해 봤는데 모두 같은 현상이다.
304 처리는 잘 되지만 만료일일 지정된 놈이 계속 요청을 보낸다. 미치겠다.

한가지 자료를 찾았다.
http://weblogs.asp.net/scottgu/archive/2006/04/11/Don_1920_t-run-production-ASP.NET-Applications-with-debug_3D001D20_true_1D20_-enabled.aspx

디버그 모드로 컴파일한 경우 axd  핸들러 내용이 캐시되지 않는다는 내용이 있다.
클라이언트의 웹사이트는 왠지 모르지만 디버그 모드로 운영중이라고 한다.(ㅡㅡ;)
나도 디버깅을 위해 디버깅상태로 테스트 햇으니 이게 유력한 용의자일까?
닷넷 개발자들의 편의를 위해 디버그 모드인 경우 수정된 내용이 바로 적용되도록 캐시를 무시하도록 처리되었다고 한다.
이제 debug=false 로 놓고 다시 테스트를 해본다.


삽질이였다.

테스트를 한다고 F5 키를 누르면서 한 것이 원인인듯 하다.
http://www.ibm.com/developerworks/kr/library/wa-aj-cache/index.html
이 자료를 보면 expires 가 설정된 경우라도 F5 를 누르면 IE는 요청을 보낸다.
그렇기 때문에 304가 계속 나온것이다.

F5 가 아닌 링크를 통해 페이지를 이동하는 경우 예상대로 요청을 보내지 않았다.
긴 삽질이였다.



신고

댓글을 달아 주세요

http://steelleg.tistory.com/entry/Lamda-Expression 에서 이어지는 내용..

Func 제너릭 델리게이트를 사용한 람다식은 코드량을 많이 줄여준다.

// Code 1
// Generic Lambda Expression Usage
Func<int, int> Square = x => x * x;
int result = Square(4);
Console.WriteLine(result); // 16


위의 코드를 보면 Square  가 제너릭 델리게이트 이므로 따로 정의할 필요가 없다.
람다식의 x 의 형은 Func<int,int> 에서 알수있다.
Func 델리게이트의 정의를 보면  Func 는 리턴형식을 갖는 델리게이트가 리턴값의 형은 제일 마지막 파라미터의 형이 된다.
즉 Func<int,int> 는 입력 파라미터로 하나의 int  를 받고 결과 리턴값으로 int 를 리턴하는 형태의 델리게이트다.
람다식은 익명함수의 내부를 표현하고 있다.
이렇게  Func 에 전달되는 형식에 의해 내부 람다식의 형이 결정된다.
함수형 프로그래밍의 3번째 특징을 만족시켜주는 부분이다.

아래의 코드를 보자.

// Code 2
// Generic Lambda Expression Usage
List<int> primes = new List<int>();
List<int> primeCubes = new List<int>();

// adding set of values to primes
primes.Add(2); primes.Add(3); primes.Add(5); primes.Add(7);

// iterate through primes elements and calculate cube and
// add it to primeCubes using Action<int> action
primes.ForEach(x => primeCubes.Add(x * x * x));

foreach (int i in primeCubes)
{
    Console.WriteLine(i);
}


foreach 문에서 Action<T>  익명메소드를 사용했다. 익명메소드를 foreach 의 argument 로 전달하고있다.

// Code 3
// Generic lambda expression usage
// declare a parameterized type XPowerN
Func<int, float, float> XPowerN = null;

// definition
XPowerN = (n, x) =>
    {
        if (n == 0) return 1.0f;
        else return x * XPowerN(n - 1, x);
    };

// using XPowerN in Square & Cube methods
Func<float, float> Square = x => XPowerN(2, x);
Func<float, float> Cube = x => XPowerN(3, x);

Console.WriteLine(Square(5.0f).ToString());
Console.WriteLine(Cube(5.0f).ToString());


Func<int,float,float> 는  int 와 float 두개의 인자를 받아 float 을 리턴하는 델리게이트 형이다.
XPowerN 은 내부를 람다식으로 정의 하고있다.
내부에서 재귀호출을 하고 있음을 주목해야 한다.

위의 코드에서 XPowerN 부분을

// The following code throws "use of unassigned local variable XPowerN" error.
Func<int, float, float> XPowerN = (n, x) =>
{
    if (n == 0) return 1.0f;
    else return x * XPowerN(n - 1, x);
};

위에 처럼 사용할 수 없다는 것을 주의 해야 한다.

Square 와 Cube 처럼 사용하는 것도 눈여겨 볼 필요가 있다.
신고

'DotNet > C# 문법' 카테고리의 다른 글

Delegate Variance(대리자 가변성)  (0) 2010.06.29
Anonimous Function  (0) 2009.12.23
Lamda Expression - Func&Action  (0) 2009.12.23
Lamda Expression - Introduce  (0) 2009.12.23
checked & unchecked 키워드  (0) 2009.12.22

댓글을 달아 주세요

참고 : http://www.codeproject.com/KB/cs/intro_functional_csharp.aspx
        http://www.codeproject.com/KB/cs/intro_functional_csharp2.aspx

C# 은 버전이 올라가면서 함수형 프로그램에서 여러가지 장점들을 도입하고 있다.
델리게이트와 익명메소드 그리고 람바표현식 등이 대표적이다.

함수형 프로그램 참조 내용 more..


우선 델리게이트는 함수 포이터 처럼 쓸수있는 기능이다.

//Code1
delegate
int MathFunc(int x); // delegate type

static void Main(string[] args)
{
    MathFunc mf = Square; // Square is an instance of the delegate MathFunc
    int result = mf(3);
    Console.WriteLine(result); // output: 9
    Console.ReadLine();
}

static int Square(int x) {return x * x;}

위의 코드는 가장 일반적인 델리게이트 사용법이다.

여기서 주목할 것은 MathFunc mf = Square;   이 코드는 사실
MathFunc mf = new MathFunc(Square);
위의 코드를 줄여쓴 것이다. 위의 코드는 C#1.0 방식의 고전 코딩방식이다.

이 델리게이트의 새로운 표현식이 C# 의 함수형 프로그램밍 표현식의 기초가 된다.

-----------------------------------------

익명메소드

위의 코드에서 mf 인스터스에 Square 를 넘기는 것은 어색해 보인다.
C#2.0 에서는 이름이 없는 함수를 정의해서 사용할 수 있는 익명메소드(anonimous method)를 새로 선보였다.
이것은 delegate 키워들 사용해서 바로 함수 바디를 정의하는 것이다.

// Code 2
// Anonymous method
delegate int MathFunc(int x);

static void Main(string[] args)
{
    MathFunc mf = delegate(int x) { return x * x; }; // anonymous method
    int result = mf(3);
    Console.WriteLine(result);
    Console.ReadLine();
}


Code1 에서 Squar 함수를 따로 정의 했던 부분이 사라졌다.

잠시 제너릭에 관해...
제너릭은 c#2.0 에 추가된 것 중 가장 강력하고 유용한 기능이다.
이를 통해 타잎 안정성이 우수해졋으며 형변환에 따른 오버해드가 줄었다.

람다표현식

c#3.0 에 추가된 기능이다.
이 것은 전 버젼에서 delegate 로 정의하던 익명메소드를 보다 쉽게 사용할 수 있게 해준다.
람다 표현식의 자세한 사항은 여기 를 참고 할 것.

// Code 4
// Lambda Expression
delegate int MathFunc(int x); // usual delegate type declaration

static void Main(string[] args)
{
    MathFunc mf = x => return x * x; // lambda expression in place of
    // delegate instance
    int result = mf(3);
    Console.WriteLine(result);
    Console.ReadLine();
}

코드 3과 비교해서 람다식은 인자의 형을 따로 지정할 필요가 없다, 컴파일러가 델리게이트를 보고 그 형을 알아서 지정해 준다. 함수형 프로그래밍의 2번째 특징인 Type Inference 를 만족하고 있다.

코드 4로도 코드가 많이 줄어들긴 했지만 여전히 람다식을 사용하기 위해서 그에 맞는 델리게이트를 매번 정의해줘야 하는 번거로움이 아직 존재한다.

.NetFramework3.5 에서 나온 제너릭 델리게이트가 이 부분을 해소해 준다.
프레임웍에는 미리정의된 두개의 제너릭 델리게이트가 존재하는데, 하나는 Func 이고 하나는 Action 이다.

이 두개의 제너릭 델리게이트를 사용하면 - 이미 정의되어 있으므로 - 따로 델리게이트를 정의할 필요가 없다.
Func 와 Action 의 차이점은 Func 는 리턴값이 존재하는 형식의 델리게이트고 Action 은 void  형식의 델리게이트라는 것 뿐이다.


// Pre-defined Func delegates
delegate TResult Func<T>();
delegate TResult Func<T1,TResult>(T1 arg1);
delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2);
delegate TResult Func<T1,T2,T3,TResult>(T1 arg1, T2 arg2, T3 arg3);
delegate TResult Func<T1,T2,T3,T4,TResult>T1 arg1, T2 arg2, T3 arg3, T4 arg4);

// Pre-defined Action delegates
delegate void Action<T>(T1 arg1);
delegate void Action<T1,T2>(T1 arg1, T2 arg2);
delegate void Action<T1,T2,T3>T1 arg1, T2 arg2, T3 arg3);
delegate void Action<T1,T2,T3,T4>T1 arg1, T2 arg2, T3 arg3, T4 arg4);

이 부분은 다음 글에 설명한다.





 


 

신고

'DotNet > C# 문법' 카테고리의 다른 글

Delegate Variance(대리자 가변성)  (0) 2010.06.29
Anonimous Function  (0) 2009.12.23
Lamda Expression - Func&Action  (0) 2009.12.23
Lamda Expression - Introduce  (0) 2009.12.23
checked & unchecked 키워드  (0) 2009.12.22

댓글을 달아 주세요

참고 : http://msdn.microsoft.com/en-us/library/74b4xzyw.aspx

checked 키워드는 런타임시 오버플로우를 체크한다.

int a= 2147483647 + 10 ;

위의 코드는 컴파일시 에러가 난다. 2147483647 은 정수형이 가르킬수있는 +값의 한계치 이므로
컴파일러가 이를 발견해서 알려준다.

하지만

int b = 10;
int a= 2147483647 + b;

위의 코드는 컴파일시 에러가 잡히지 않는다.

런타임시 이런 오버플로우 오류를 검사하는 키워드가 checked 이다.

static int CheckedMethod()
    {
        int z = 0;
        try
        {
            // The following line raises an exception because it is checked.
            z = checked(maxIntValue + 10);
        }
        catch (System.OverflowException e)
        {
            // The following line displays information about the error.
            Console.WriteLine("CHECKED and CAUGHT:  " + e.ToString());
        }
        // The value of z is still 0.
        return z;
    }

위 처럼 쓰면 checked(maxIntValue + 10); 이 부분에서 exception 이 발생한다.
위의 코드에서 checked 부분을 제거하면 exception 발생없이 처리되고
z 는 -2147483639 라는 잘못된 값을 리턴한다.

checked 는 블록형태로 쓸 수도 있다.

checked
{
    int i3 = 2147483647 + ten;
    Console.WriteLine(i3);
}



unchecked 는 위와 반대로 오버플로우 체크를 하지 않도록 억제하는 역할을 한다.

unchecked
{
    int1 = 2147483647 + 10;
}
int1 = unchecked(ConstantMax + 10);

위 처럼 하면 컴파일시에도 예외가 발생하지 않는다.

unchecked 를 설정하면 그 부분에 대해 오버플로우 검사를 하지 않으므로 성능이 좋아 지기는 하지만
중요한 처리인 경우 위험 할 수 있다.
반드시 오버플로우가 발생할 일이 없을 거란 확신이 있는 경우만 사용한다.








신고

'DotNet > C# 문법' 카테고리의 다른 글

Delegate Variance(대리자 가변성)  (0) 2010.06.29
Anonimous Function  (0) 2009.12.23
Lamda Expression - Func&Action  (0) 2009.12.23
Lamda Expression - Introduce  (0) 2009.12.23
checked & unchecked 키워드  (0) 2009.12.22

댓글을 달아 주세요

세션 객체를 저장해야 하는 일이 있어 어떤 컬렉션에 저장할지 고민 하던중에 발견하였다

WCF 콜백 객체를 static 콜렉션에 넣어두고 특정 이벤트 발생시 콜렉션에서 콜백객체를 찾아 클라이언트에게 콜백 메세지를 보내야 한다.

헌데..

싱글 로그인만 허용하는 것이 아니라 여러 피씨에서 같은 개정으로 로그인한 모든 클라이언트에게 같은 메세지를 보내야 한다.

해당 사용자의 아이디를 키로 콜백 객체를 저장하려면 hashtable 이나 딕셔너리를 사용해야 하는데..
이놈들은 기본적으로 중복키를 허용하지 않는다.

하지만 NameValueCollection 이란 놈은 사용법은 딕셔너리와 유사하면서 중복키를 허용해준다.
이놈에게 아이디를 키로 저장하고 키값으로 찾으면 여려개의 value 를 리턴한다.
루프 돌면서 콜백객체의 메소드를 호출하면 해당 아이디로 로그인한 클라이언트에 모두 메세지를 보낼수 있을 듯..

NameValueCollection nv = new NameValueCollection();

nv.Add("key","SomeText1");
nv.Add("key","SomeText2");

foreach(string s in nv.GetValues("key")
{
   Console.WriteKLine(s);
}

역기서 주의 할 점은

nv["key"]="SomeText1";
nv["key"]="SomeText2"; // 기존값을 덮어쓴다.

위 처럼 쓰게 되면 키에 해당하는 값을 수정하는 코드가 된다. 값을 추가 할 때는 반드시 Add 를 써야 한다.

또 한가지 주의 할 점은 키가 아니라 인덱서를 써서 값을 가져오는 경우 인데,
GetValues 가 아닌 인덕서로 값을 가져오는 경우 만약 그 해당 키에 값이 하나 이상이라면 ',' 를 딜리미터 값을 반환 한다고 한다.

신고

댓글을 달아 주세요

C# Goto Statement

DotNet 2009.04.17 13:46 |

몇일 전 c++ 코드로 된 소스를 인수인계 받게 되었다.
코드를 보던 중 goto 문이 있어 놀랐다.
전에 vb 이나 sql sp 에서 써본 적은 있지만 c++ 에서 쓰는 것은 참 생소했기 때문이다.
내가 c++ 경력이 미천해서 그런 것일텐데...
구시대 문법이라고 생각했던 goto 문이 혹시나
c# 에도 있는지 구글 검색을 해봤더니

http://www.blackwasp.co.uk/CSharpGoto.aspx

위의 글에서 처럼 swtich 문에 활용하는 방법을 알게되었다.
남발하지 않고 이정도 쓰임새라면 좋은 활용이 되겠다는 생각이다.

string statusCode = "Warn";

switch (statusCode)
{
    case "Warn":
        Console.WriteLine("Completed with warnings.");
        goto case "Complete";
    case "Err":
        Console.WriteLine("Completed with errors.");
        goto case "Complete";
    case "Complete":
        Console.WriteLine("Completed.");
        break;
    case "Fail":
        Console.WriteLine("Failed to complete.");
        break;
    default:
        Console.WriteLine("Unknown status code");
        goto case "Fail";
신고

'DotNet' 카테고리의 다른 글

C# 에서 파일에 lock 걸기  (0) 2009.12.29
NameValueCollection : 중복키를 허용하는 key-value pair collection  (0) 2009.10.13
C# Goto Statement  (3) 2009.04.17
C# 성능 튜닝 - Array  (7) 2008.11.24
c# 성능 튜닝 - 문자열  (0) 2008.11.24
C# 용 Zip 라이브러리 - #ZipLib  (2) 2008.03.07

댓글을 달아 주세요

  1. 2009.04.28 15:50 Address Modify/Delete Reply

    비밀댓글입니다

  2. 2009.05.05 15:03 Address Modify/Delete Reply

    비밀댓글입니다

  3. 장승재 2009.05.05 15:06 신고 Address Modify/Delete Reply

    안녕하세요

    저는 이스라엘 유학중이구요 티스토리에 가입을 하고싶은데 쉽지가 않군요.

    유학중에 찍은 사진을 공유할수 잇는 블로그를 만들어 볼려구 초대장을 부탁하러 왔습니다 ^^;

    초대 부탁드립니다.

    asjesus-@hanmail.net

C# 성능 튜닝 - Array

DotNet 2008.11.24 11:45 |

출처 :http://www.hoons.kr/Board.aspx?Name=cshaptip&Mode=2&BoardIdx=17191&Key=&Value=


using (Image img = Image.FromFile(filePath))

{

    for (int x = 0; x < img.Width; x++)

    {

        for (int y = 0; y < img.Height; y++)

        {

            //Do something

        }

    }

}


위의 코드를 살펴보자.

여기서 using 은 using 안에서 생성한 오브젝트가 유효한 범위를 말한다.
즉 using 이 끝나는 시점에서 생성한 오브젝트의 dispose() 가 호출된다.(물론 이 객체는 IDispose 인터페이스를 구현하고 있어야 한다)

여기서 유심히 볼 부분은 for 문인데, 루프 한번 돌때 마다 아래와 같은 작업이 일어난다.

1. x < Image.Width 검사
2. 이미지 객체 참조
3. Width 속성이 있는지 검사
4. Width 값 읽기
5. Width 값 리턴
6. 루프 계속 진행

위의 단계를 줄여 속도를 높인 코드가 아래 있다.

using (Image img = Image.FromFile(filePath))

{

    int width = img.Width;

    int height = img.Height;

    for (int x = 0; x < width; x++)

    {

        for (int y = 0; y < height; y++)

        {

            //Do something

        }

    }

}



오브젝트 array 를 다룰 때도 마찬가지다. 아래처럼 쓰는 것이 더 빠르다.

SomeObject[] objList = new SomeObject[1000];

int count = objList.Length;

for (int i = 0; i < count; i++)

{

    SomeObject obj = objList[i];

    //Do something

}



그런데...foreach 는 어떨까?

foreach (SomeObject obj in objList)

{

    //Do something

}


foreach 가 더 빠를 것 같지만 사실 그렇지 않다. for 를 사용하고 그 길이를 변수에 저장하고 내부에서 casting 해서 사용하는 것이 더 빠르다.

여기서...갑자기 궁금해서 검색을 해봤더니 http://www.madprops.org/blog/for-vs-foreach-performance/ 이 글에서 테스트를 했다. 약 3배차이가 났다...오우


한번 쯤 이런 실수들을 해봤을 것이다.
아래는 리스트를 비우는 코드다.

List<SomeObject> objList = new List<SomeObject>();

//Add object to list

int count = objList.Count;

for (int i = 0; i < count; i++)

{

    objList.RemoveAt(i);

}


하지만 이 코드는 에러가 난다.
하나의 리스트 항목을 삭제하면 objList.Count 값이 매번 달라지기 때문에 i 가 인덱스 하는 범위가 Count 의 범위를 넘어선다.

그래서 거꾸로 루프를 돌아야 한다.

List<SomeObject> objList = new List<SomeObject>();

//Add object to list

int count = objList.Count;

for (int i = count - 1; i > 0; I--)

{

    objList.RemoveAt(i);

}


다른 좋은 방법이 있다.

while (objList.Count > 0)

{

    objList.RemoveAt(0);

}


위의 루프에서는 objList.Count 에 매번 접근하고 있다. 이글의 맨처음에 언급한 내용에 따르면
이 루프는 느리다. 그래도 보다 안정적이다. 이 코드는 어느경우에서든 리스트를 깨끗히 비워준다.

신고

'DotNet' 카테고리의 다른 글

NameValueCollection : 중복키를 허용하는 key-value pair collection  (0) 2009.10.13
C# Goto Statement  (3) 2009.04.17
C# 성능 튜닝 - Array  (7) 2008.11.24
c# 성능 튜닝 - 문자열  (0) 2008.11.24
C# 용 Zip 라이브러리 - #ZipLib  (2) 2008.03.07
Directshow.net Library  (0) 2008.01.29

댓글을 달아 주세요

  1. Favicon of http://redcarrot.tistory.com BlogIcon 빨간당무 2009.08.18 04:24 신고 Address Modify/Delete Reply

    잘 봤습니다. 특히 마지막에 리스트를 비우는 부분에서 많은 사용자들이 흔하게 오류를 범하는 것을 볼 수 있었던것 같습니다. ^^
    참고로 저도 리스트를 비우는 것과 관련되서 학습하다

    while (objList.Count > 0)
    {
    objList.RemoveAt(0);
    }
    보다 더 좋은 방법을 알게 되어 코멘트 달아 봅니다. ^^

    objList = new List<SomeObject>();
    즉, 다시 생성해 주는 거지요. 물론 가비지컬렉터가 지원되는 언어야만 메모리 누수가 없겠지요 ^^;;;

    • 무쇠다리 2009.08.20 12:24 신고 Address Modify/Delete

      생각해 보니 말씀해 주신 방법도 좋은 방법이겠네요.
      어차피 가비지콜렉터가 동작할때나 메모리가 해제되니까..
      reomove 를 하든 새로 만들든 GC 가 동작하기전에는 모두 메모리를 차지 하고 있을테니...

  2. xeroplus 2010.12.08 09:27 신고 Address Modify/Delete Reply

    처음의 경우는 신기하네요

    보통 C++ 컴파일러등에서는 컴파일러에서 처리해 주는데

    C# 컴파일러 성능은 떨어지는듯

    • 무쇠다리 2010.12.14 10:19 신고 Address Modify/Delete

      컴파일러? => 런타임 아닌지요.

      c#의 성능 문제는 그리 심각한 것은 아니라고 생각합니다.
      머신의 성능이 좋아져서, 이제는 생산성과 유지보수성이 우수한 쪽이 이슈가 아닐까요.
      그러고 보니 그동안 성은에 대해서는 좀 잊고 살았네요.

  3. 버섯돌이 2011.01.05 11:31 신고 Address Modify/Delete Reply

    위에 xeroplus 님이 말씀하시는 건...
    런타임시의 성능을 말씀하시는게 아니라
    코드를 저런식으로 작성하더라도 컴파일 시점에 왠만한 옵티마이즈 기능을 수행해준다는거겠죠?

    컴파일 최적화 기능을 비활성화 한 뒤에 실행하면 차이가 나겠지만..
    그렇지 않다면 기본적인 최적화 기능을 수행하기때문에
    최종 생성된 소스에서는 첫번째 처럼 작성하더라도
    최종 컴파일된 소스는 후자 처럼 최적화 되어 있다는 의미로 말씀하신게 아닐까 싶네요.

    다만, 코딩 습관시 컴파일러는 만능은 아니기때문에 방어 차원에서 적용하는 부분도 있고..
    요즘은 말씀하신것 처럼 머신의 성능이 좋아져서 최적화 위주의 코드보다도
    사람이 알기 쉬운 코드를 작성하는 쪽에 포커스를 맞추기도 합니다.
    적절히 섞어서 사용하겠지요..^^

    • 무쇠다리 2011.01.14 10:15 신고 Address Modify/Delete

      네 그렇군요.
      컴파일러가 최적화 해주는 것을 말씀하신듯 합니다.

      좋은 지적 감사합니다.

  4. Favicon of http://mop.scarpehoganil.com/ BlogIcon hogan 2013.04.10 23:30 신고 Address Modify/Delete Reply

    행운 만이 개인 능력 당신이 일생 동안 도와 드릴까요 평생 할 수 없습니다 않습니다.

출처 :http://www.hoons.kr/Board.aspx?Name=cshaptip&Mode=2&BoardIdx=17164&Key=&Value=

String vs StringBuilder

스트링 사용시 많은 프로그래머가 아래와 같은 코딩을 합니다.

String output = "";

output += "Hello";

output += " ";

output += "World";


스트링과 스트링을 연결하는 "+" 연산자가 어떻게 동작하는지 살펴보면

Char[] tempValue = new Char[output.Length + "Hello".Length];

tempValue = output + "Hello";

Array.Clear(output, 0, output.Length);

output = null;

output = new Char[tempValue.Length];

output = tempValue;

Array.Clear(tempValue);


위와 같이
연결할 문자열길이 만큼의 임시 메모리를 할당하고, 그 안에 연결된 문자열을 복사해 옮깁니다.
그 다음에 원본 문자열을 없애고 원본 변수에 새로운 문자열 크기 만큼의 메모리를 할당합니다.
그 다음에 임시 메모리에 옮겨두었던 문자열을 모두 복사해 이동시키고, 임시 메모리를 해제 합니다.

이처럼 "+" 연산자 하나를 쓸때마다 위와 같은 작업을 컴퓨터가 수행하게 됩니다.

따라서 "+" 보다는 가변 문자열을 사용하는 StringBuilder 를 사용하는 것이 더 좋은 성능을 내줍니다.
스트링빌더는 임시 메모리 할당을 하지 않고 스트링을 링크시켜 연결합니다.
즉 "hello" 에 "world"를 append 하면 둘을 합친 새로운 스트링을 만들지 않고 hello 와 world 를 바로 연결합니다.(linked list 처럼..) 그래서 toString() 을 호출할때 만 링크를 결합한 새로운 스트링을 만들어 리턴합니다.
그래서 성능이 우수하죠.

String = “xxx” + yyy + “ “ + zzz

스트링을 특정 형식으로 구성할 때 위와 같은 문자연결 보다는
string.Format 을 사용하는 것이 좋다. 이 매소드는 내부적으로 StringBuilder 를 사용한다.

String.Format("xxx{0} {1}", yyy, zzz);


 만약 형식이 없이 단순히 스트링을 연결하는 것만 필요하다면 string.Concat 을 사용하는 것이 좋다.

String.Concat("xxx", yyy, zzz);



 String.Equals vs "=="


두개의 문자를 비교할 때 흔히 '==' 비교 연산자를 사용한다.
두개의 문자를 대소문자 구분없이 비교하기 위해서 아래와 같은 코드를 주로 사용하는데..

String source = "abcdef";

String compareValue = "Abcdef";

if (source.ToLower() == compareValue.ToLower())

{

    //Do something

}


이 코드 처럼 toLower 나 toUppder 의 도움을 받아 비교하게 되면 두개의 임시 메모리가 할당 된다.

위의 코드 보다는 object 를 직접 비교하는 Equals 메소드가 좋다.
if (source.Equals(compareValue, StringComparison.OrdinalIgnoreCase))


스트링 값이 비었는지 검사할 때

String source = "";

if  ((source != null) && (String != ""))

{

    //Do something

}


위의 코드 처럼 스트링을 담는 변수가 null 혹은 string.Empty 인지 복잡하게 코딩하는 것 보다
string 내장 함수인 IsNullOrEmpty 를 사용하는 것이 직관적이고 편하다.

if (String.IsNullOrEmpty(source))

{

    //Do something

}



참고로 StringBuilder 를 사용할 때 MaxCapacity 를 지정하는 것이 훨씬 빠르다고 한다.

신고

'DotNet' 카테고리의 다른 글

C# Goto Statement  (3) 2009.04.17
C# 성능 튜닝 - Array  (7) 2008.11.24
c# 성능 튜닝 - 문자열  (0) 2008.11.24
C# 용 Zip 라이브러리 - #ZipLib  (2) 2008.03.07
Directshow.net Library  (0) 2008.01.29
Timer 사용하기  (3) 2007.06.21

댓글을 달아 주세요


http://www.icsharpcode.net/OpenSource/SharpZipLib/


#ziplib (SharpZipLib, formerly NZipLib) is a Zip, GZip, Tar and BZip2 library written entirely in C# for the .NET platform. It is implemented as an assembly (installable in the GAC), and thus can easily be incorporated into other projects (in any .NET language). The creator of #ziplib put it this way: "I've ported the zip library over to C# because I needed gzip/zip compression and I didn't want to use libzip.dll or something like this. I want all in pure C#."

신고

'DotNet' 카테고리의 다른 글

C# 성능 튜닝 - Array  (7) 2008.11.24
c# 성능 튜닝 - 문자열  (0) 2008.11.24
C# 용 Zip 라이브러리 - #ZipLib  (2) 2008.03.07
Directshow.net Library  (0) 2008.01.29
Timer 사용하기  (3) 2007.06.21
GUID 동적으로 사용하기  (3) 2007.06.21

댓글을 달아 주세요

  1. Favicon of http://www.moncleroutletespain.com/ BlogIcon moncler online 2013.01.05 20:32 신고 Address Modify/Delete Reply

    "Eva et Eduardo sont amis". C'est en ces termes laconiques que l'agent de l'actrice de la série Desperate Housewifes Eva Longoria, http://www.moncleroutletespain.com/ moncler outlet, en instance de divorce avec le basketteur Tony Parker, pose un terme, http://www.moncleroutletespain.com/ moncler online, mercredi, à la rumeur lui prêtant une relation avec le chanteur Eduardo Cruz (voir leurs portraits, en illustration), le frère de l'actrice Penelope Cruz, http://www.moncleroutletespain.com/ moncler españa, dans les colonnes de la célèbre Page Six à potins du New York post, http://www.moncleroutletespain.com/ moncler. Plus d'infos dans l'article de la rubrique People de TF1 News, http://www.moncleroutletespain.com/ http://www.moncleroutletespain.com/, ci-dessous, http://www.moncleroutletespain.com/ moncler chaquetas. People Tournée Johnny Hallyday : 15 mai 2012 People Eva Longoria dément une romance avec le frère de Penelope CruzRelated articles:


    http://koreaceladon.tistory.com/134 http://koreaceladon.tistory.com/134

    http://korea-pop.tistory.com/251 http://korea-pop.tistory.com/251

  2. Favicon of http://louisvuittonshoes.judisells.com BlogIcon Sacsxahy 2013.05.07 09:12 신고 Address Modify/Delete Reply

    http://louisvuittonsale.judisells.com of course online resources costs you receive visible, you are able to promote your opportunity the item plenty of different ways cost-free. areas like site swaps together with short post submission moves get you exposure to your site while not total price except for you schedule. and we will have in some time, a blog might be aired additional ways no cost. louis vuitton sneakers for men mid top black http://louisvuittonshoes.judisells.com

티스토리 툴바