릴리즈 버전을 기준으로 할 때 unsafe가 제일 빠르다.

 

디버그 버전

 

 BitConverter

 50 ms

 Marshal

 802 ms

 unsafe

 140 ms

 

 

릴리즈 버전

 

 BitConverter

 49 ms

 Marshal

 631 ms

 unsafe

 32 ms

 

 

테스트 코드

class Program
{
 const int COUNT = 1000000;
 static void Main(string[] args)
 {
  var basearray = Enumerable.Range(0, 1024).Select(x => (byte)x).ToArray();

  var sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = BitConverter.ToInt64(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"BitConverter {sw.ElapsedMilliseconds}ms");

  sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = BtoS<Int64>(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"Marshal {sw.ElapsedMilliseconds}ms");

  sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = ToInt64(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"unsafe {sw.ElapsedMilliseconds}ms");

 

  Console.ReadKey();
 }

 private static T BtoS<T>(byte[] bytes, int startIndex) where T : struct
 {
  GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
  T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject() + startIndex,
   typeof(T));
  handle.Free();
  return stuff;
 }

 unsafe static void PutBytes(byte* dst, byte[] src, int start_index, int count)
 {
  for (int i = 0; i < count; i++)
   dst[i] = src[i + start_index];
 }

 unsafe static Int64 ToInt64(byte[] bytes, int startIndex)
 {
  Int64 ret;

  PutBytes((byte*)&ret, bytes, startIndex, 8);

  return ret;
 }

}

 

 

출처: http://qiita.com/yu_ka1984/items/fa403894af35a3f3925c

 

 

저작자 표시
신고
by 흥배 2016.01.20 09:00

1. 공개 URL 지정

셀프 호스팅에 관한 기사를 보면 대부분 http://localhost:8080 와 같은 localhost 전용의 URL이 지정 되어 있다. 루프 백을 나타내는 설정으로 이 상태로는 외부에서 접근할 수 없다.

자신에게 부여된 IP 주소로 서비스를 공개하고 싶다면 다음과 같이 한다.

[STAThread]

static void Main()

{

using(WebApp.Start("http://+:8080")

{

//---생략

}

}

 

localhost 설정을 + 으로 바꾸는 것이 포인트.

 

 

 

2. 관리자 권한으로 실행

실행하면 TargetInvocationException 예외가 발생한다.

이를 피하기 위해서는 애플리케이션을 관리자 권한으로 실행해야 한다.

app.manifest 에 아래의 설정을 넣는다

 

<?xml version="1.0" encoding="utf-8"?>

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">       

<security>           

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">               

<!—실행 시에 관리자 권한을 요구 -->               

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />            </requestedPrivileges>       

</security>   

</trustInfo>

</assembly>

 

Visual Studio에서 디버깅 할 때는 Visual Studio 자체도 관리자 권한으로 승격시켜야 한다.(앞의 매니페스토 설정을 넣으면 디버깅 실행 시 관리자 권한 승격을 요구한다)

 

 

3. 통신 포트 해방

마지막으로 방화벽 수신/송신 규칙에 통신용 포트를 해방하는 설정을 넣는다.

 

 

 

출처: http://blog.xin9le.net/entry/2015/08/17/150406

 

저작자 표시
신고
by 흥배 2016.01.18 08:00
.net, C#

C#로 배열을 확보한 뒤 dl것을 IEnumerable IReadOnlyList로 받아서 처리할 경우 어느 정도의 속도 차이가 있는지를 측정.

.NET 4.6, x64 환경에서 조사.

 

100000000 요소에서 결과는

Array        87 ms.

IEnumerable  624 ms.

IReadOnlyList 568 ms.

 

속도가 중요한 경우는 IEnumerable 등으로 받아서 내부에서 배열로 캐스트 해서 처리하는 특별 루틴을 넣는 것을 생각해도 좋을듯.

 

 

아래는 테스트 코드:

 

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

 

namespace ColTest

{

  class CollectionSpeedTest

  {

    public static void Main(string[] args)

    {

      var count = int.Parse(args[0]);

      var arr = random().Take(count).ToArray();

      using (new StopwatchHelper("Array"))

        TestArray(arr);

      using (new StopwatchHelper("IEnumerable"))

        TestIEnumerable(arr);

      using (new StopwatchHelper("IReadOnlyList"))

        TestIReadOnlyList(arr);

    }

 

    static double TestArray(double[] arr)

    {

      double sum = 0;

      for (int i = 0; i < arr.Length; i++)

        sum += arr[i];

      return sum;

    }

 

    static double TestIEnumerable(IEnumerable<double> en)

    {

      double sum = 0;

      foreach (var v in en)

        sum += v;

      return sum;

    }

 

    static double TestIReadOnlyList(IReadOnlyList<double> col)

    {

      double sum = 0;

      for (int i = 0; i < col.Count; i++)

        sum += col[i];

      return sum;

    }

 

    static IEnumerable<double> random()

    {

      var random = new Random();

      for (;;)

      {

        yield return random.NextDouble();

      }

    }

 

    class StopwatchHelper : IDisposable

    {

      public StopwatchHelper(string format, params string[] args)

      {

        Console.WriteLine(format, args);

        sw.Start();

      }

 

      public void Dispose()

      {

        sw.Stop();

        Console.WriteLine("{0} ms.", sw.ElapsedMilliseconds);

      }

 

      Stopwatch sw = new Stopwatch();

    }

  }

}

 

 

출처: http://espresso3389.hatenablog.com/entry/2015/11/09/212923

저작자 표시
신고
by 흥배 2015.12.14 08:00

강연에서 사용한 Demo 프로젝트

https://github.com/jacking75/kgc2015Demo_ServerMornitoringSystem


강연 문서





저작자 표시
신고
by 흥배 2015.12.02 08:00

C#을 사용해서 MongoDB 프로그래밍 하는 방법을 간단하게 정리해 보았다.

https://github.com/jacking75/CookBookMongoDB-CSharp


완전 초보자 대상이 아니고 C# 및 nuget 등을 아는 사람을 대상으로 하고 있다. 또 MongoDB에 대해서는 특별히 다루지 않는다.


앞으로 틈틈히 업데이트를 할 예정이다. 그리고 PR도 기다린다^^


코드 테스트는 LinqPad를 사용하는 것을 추천한다.



저작자 표시
신고
by 흥배 2015.10.14 08:00
.net, C#

1. *.cscfg

WebRole, WorkerRole 프로젝트를 만들면 생긴다.

Azure WebSites가 있으므로 앞으로는 잘 안 쓰일 것 같다.

 

 

환경마다 설정

환경마다(Production, Staging ) 설정이 가능하다.

ex) ServiceConfiguration.Production.cscfg

 

 

반영 방법

패키지 재 작성이 불필요. Azure 관리 포털에서 직접 변경할 수 있다.

 

 

 

2. app.config / web.config <appSettings>

환경마다 설정

환경마다(Production, Staging ) 설정이 가능하다.

ex) web.Debug.config

 

 

반영 방법

패키지의 재 작성이 필요.

 

 

 

3. app.config / web.config <applicationSettings>

데이터 유형 지정을 할 수 있다.

 

환경마다 설정

불가능. app.Debug.config 처럼 만들어도 읽는 것은 app.config(Settings.settings)에 기술되어 있는 값

 

 

반영 방법

패키지의 재 작성이 필요.

 

 

 

4. Settings.settings

프로젝트를 오른쪽 클릭하고 "속성"->"설정"에서 표시된다.

 

이것은

• 범위를 애플리케이션으로 하면 app.config/web.config <applicationSettings>에 기술한다

• 범위를 사용자로 하면 app.config/web.config <userSettings>에 기술한다

 

참고로 사용자 범위 파라미터는 프로그램에서 변경 보존이 가능.

 

 

 

설정 파일 읽기

CloudConfigurationManager.GetSetting(name)

이것은 처음 *.cscfg을 찾아보고 없으면 app.config/web.config <appSettings>를 본다

 

 

(Web)ConfigurationManager.AppSettings[name];

app.config/web.config <appSettings>를 본다

 

 

Properties.Settings.Default.<name>

app.config/web.config <applicationSettings>를 본다

 



출처: http://qiita.com/ko2ic/items/6dd2a57759829a3620f0

 

 

저작자 표시
신고
by 흥배 2015.09.07 08:00




















































저작자 표시
신고
by 흥배 2015.08.24 08:00

주 기능: 지정된 시간에 실행해야 할 Job을 등록해 놓으면 해당 시간이 되면 Job을 실행한다.

오픈 소스: https://github.com/jgeurts/FluentScheduler

설치: Nuget으로 쉽게 설치할 수 있다.

 

예제 코드

1) 현재 등록된 job 개수

// 만약 이전에 job을 등록한적이 없다면

// TaskManager.Initialize(new Registry());

// 로 초기화 해 준후 사용해야 한다.

var count = TaskManager.AllSchedules.Count();

 

 

2) 등록된 모드 Job 정보 보기

var allJobs = TaskManager.AllSchedules;

foreach (var job in allJobs)

{

           var info = string.Format("Name:{0}, 실행예정시간:{1}", job.Name, job.NextRunTime.ToString("yyyy MM-dd HH:mm:ss"));

}

 

 

3) 모든 Job 삭제

var jobNameList = new List<string>();

 

var allJobs = TaskManager.AllSchedules;

foreach (var job in allJobs)

{

           jobNameList.Add(job.Name);

}

 

foreach (var name in jobNameList)

{

           TaskManager.RemoveTask(name);

}

 

 

4) 매번 실행되는 Job

TaskManager.AddTask(

                                () => DevLog.Write("(3초마다) Runner1 " + DateTime.Now), x => x.WithName("Runner1").ToRunEvery(3).Seconds()

                                );

 

5) 한번만 실행되는 Job

TaskManager.AddTask(

                                () => DevLog.Write("(3초 후에 딱 한번)OnceRunner1 " + DateTime.Now), x => x.WithName("OnceRunner1").ToRunOnceIn(3).Seconds()

                                );

 

 

6) 매일 특정 시간에만 실행되는 Job

TaskManager.AddTask(

                                () => DevLog.Write("(매일 0 0 0초 마다)1DayJob " + DateTime.Now), x => x.WithName("1DayJob").ToRunEvery(1).Days().At(0, 0)

                                );

 

7) 등록과 동시 실행 후 매번 실행

TaskManager.AddTask(

                                () => DevLog.Write("(5초 마다)Runner2 " + DateTime.Now), x => x.WithName("Runner2").ToRunNow().AndEvery(5).Seconds()

                                );

 

8) 매주 특정 요일에만 실행

// 지금으로 부터 1주일 후 목요일

TaskManager.AddTask(

            () => DevLog.Write("(매주 목요일마다)Runner3 " + DateTime.Now), x => x.WithName("Runner3").ToRunEvery(1).Weeks().On(DayOfWeek.Thursday)

            );

 

// 이번 주 목요일

TaskManager.AddTask(

                                () => DevLog.Write("(매주 목요일마다)Runner3 " + DateTime.Now), x => x.WithName("Runner3").ToRunEvery(0).Weeks().On(DayOfWeek.Thursday)

                                );

 

 

9) 한번에 아주 많은 수의 job을 등록할 때

TaskManager.AddTask를 사용하여 많은 수(1000만개 이상) job을 등록할 때 등록이 끝나기 전에 job이 실행되어 버리면 추가하는 도중 예외가 발생한다. 이유는 AddTask 함수는 새로운 job이 등록될 때마다 정렬을 하고 있어서 그렇다. 그래서 한번에 많은 job을 등록할 때는 Registry 클래스를 사용하여 job을 등록해야 한다.

 

var registry = new MyRegistry();

registry.Init(jobCount);

 

TaskManager.Initialize(registry);

 

 

public class MyRegistry : Registry

{

           public void Init(int jobCount)

           {

                     var rand = new Random();

 

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

                     {

                                int delayTimeSec = rand.Next(10, 30);

 

                                Schedule( () => newTask.Execute()).WithName("dummyTask_" + i).ToRunOnceIn(delayTimeSec).Seconds();

                     }

           }

}

 

public class MyTask : ITask

{                   

           public void Execute()

           {

           }

}

 

저작자 표시
신고
by 흥배 2015.06.11 08:00
.net, C#

Windows에는 기본으로 C#VB.NET의 컴파일러가 설치 되어 있다(Visual StudioSDK 설치를 하지 않아도).

 

위치는 C:\Windows\Microsoft.NETFramework 디렉토리에 있다(64비트 OS라면 Framework64 디렉토리도 있다).

csc.exeC# 컴파일러, vbc.exeVB.NET 컴파일러이다.

 

Windows 8.1의 컴파일러는 닷넷프레임워크 4.5 버전이다. 디렉토리는 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 되어 있지만 닷넷프레임워크 4.5 버전이다.

 

Windows에 컴파일러가 들어간 것은 Vista 부터이지만 XP도 중요 업데이트를 하면 설치된다.

 

C# 컴파일러 사용 예

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc HelloWorld.cs

저작자 표시
신고
by 흥배 2015.04.30 08:00
C#

static class 익명형

{

           public static void Test()

           {

                     var character = new { ID = 11, Name = "test" };

                     Console.WriteLine("캐릭터 ID:{0}, Name:{1}", character.ID, character.Name);

           }

}

 

 

저작자 표시
신고
by 흥배 2015.04.23 08:00
| 1 2 3 4 5 ··· 7 |