UDP 멀티 캐스트 전송 속도를 조절하기 위해 .NET 앱에서 마이크로 초 지연이 필요합니다.

StackOverflow https://stackoverflow.com/questions/1631501

문제

C#에 UDP 멀티 캐스트 클라이언트/서버 쌍을 쓰고 있으며 서버 전송 속도를 스로틀하려면 50-100 µsec (마이크로 초)의 지연이 필요합니다. 이를 통해 상당한 패킷 손실을 피하고 디스크 I/O 묶인 클라이언트에 과부하가 걸리지 않도록 도와줍니다. strook을 제안하지 마십시오. 나는 그 중 하나가 필요한지 묻지 않을 것입니다.

나의 첫 번째 생각은 일종의 고성능 카운터를 사용하고 간단한 시간 () 루프가 경과 한 시간을 점검하는 것이었지만 Kludgey 느낌이 들기 때문에 피하고 싶습니다. 서버 프로세스에 대한 CPU 활용도를 잡아 당기지 않습니까?

크로스 플랫폼 솔루션의 보너스 포인트 (즉, Windows 별이 아닌). 미리 감사드립니다, 여러분!

도움이 되었습니까?

해결책

나는 사용할 것이다 스톱워치 그러나 루프가 필요합니다

읽다 이것 ElapsedMicroseconds와 같이 StopWatch에 더 많은 확장을 추가하려면

아니면 이와 같은 것도 효과가있을 수 있습니다

System.Diagnostics.StopWatch.Ishigresolution 해야 하다 사실이라

    static void Main(string[] args)
    {
        Stopwatch sw;
        sw = Stopwatch.StartNew();
        int i = 0;

        while (sw.ElapsedMilliseconds <= 5000)
        {
            if (sw.Elapsed.Ticks % 100 == 0)
            { i++; /* do something*/ }
        }
        sw.Stop();


    }

다른 팁

매우 짧은 수면 시간은 일반적으로 CPU 스핀 루프 (예 : 묘사 한 종류)에 의해 달성되는 것이 가장 좋습니다. 일반적으로 고정밀 타이머 호출을 사용하지 않으려 고합니다. 나는 짧은 대기 시간 동안 서버에서 CPU 페깅에 대해 너무 걱정하지 않을 것입니다.

다음과 같이 수업에서 동작을 캡슐화합니다.

  • 정적 생성자가 수백만 개의 반복을 위해 스핀 루프를 실행하고 걸리는 시간을 캡처하는 클래스를 만듭니다. 이를 통해 단일 루프 사이클이 기본 하드웨어에 얼마나 오래 걸리는지에 대한 아이디어를 제공합니다.
  • 임의의 수면 시간을 계산하는 데 사용할 수있는 미국/반복 값을 계산하십시오.
  • 특정 기간 동안 잠을 자라고 요청했을 때, 우리를 이전에 계산 한 미국/반복 값으로 잠을 자도록 나누기 위해 수행 할 루프 반복의 수를 식별하십시오.
  • 예상 시간이 경과 할 때까지 while 루프를 사용하여 회전하십시오.

멀티 캐스트 응용 프로그램으로 더 정밀도가 필요할 때 그러한 요구 사항을 경험했습니다.

최상의 솔루션은 이 예.

이 구현을 사용하고 TPL Async Invoke를 추가했습니다. 당신은 내 것을 봐야합니다 단순한 분류 된 것 자세한 내용은 프로젝트.

    static void udelay(long us)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        long v = (us * System.Diagnostics.Stopwatch.Frequency )/ 1000000;
        while (sw.ElapsedTicks < v)
        {
        }
    }
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine("" + i + " " + DateTime.Now.Second + "." + DateTime.Now.Millisecond);
            udelay(1000000);
        }
    }

당신은 보셨습니까? 멀티미디어 타이머? API 호출을 어딘가에 랩핑하는 .NET 라이브러리를 찾을 수 있습니다.

스핀 루프가 소비하고 차단 스레드를 생성 할 때 사용하지 않겠습니다. Thread.Sleep은 더 좋고 수면 중에 프로세서 리소스를 사용하지 않고 시간을 얇게 썬다. 시도해 보면 작업 관리자가 스핀 루프로 CPU 사용이 어떻게 급등하는지 알 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top