성능 비교

  • Snappy (Build with Visual Studio 2012)
    • SizeOut: 8746 KB, QueryPerformanceCounter: 148012
  • ZLib (Build with Intel c compiler)
    • SizeOut: 6093 KB, QueryPerformanceCounter: 1572292
  • ZLib (Build with Delphi native code)
    • SizeOut: 6093 KB, QueryPerformanceCounter: 1986675

압축 원본은 18메가가 조금 넘는 Bitmap 파일 입니다.  SizeOut이 압축 후의 크기 입니다.


ZLib의 경우에는 가장 빠른 압축 옵션을 통해서 테스트 하였습니다.  여하튼 압축 속도에서 Snappy가 단연 선두입니다.



라이브러리 파일


Snappy.zip


델파이 유닛(Snappy.pas)과 Visual Studio 2012를 통해서 빌드 된 snappy.dll이 포함되어 있습니다.  사용법은 너무 간단하니, 패스합니다 ^^*;  (유닛 안에 코멘트로 간략한 사용법은 작성되어 있습니다)



기타


파일 크기를 작게하면 압축률 차이가 좀 더 심해지는 경향이 있습니다.  한편으로는 압축 속도 차이도 심해집니다.  즉, 압축하는 데이터의 크기가 작아지면, Snappy의 압축률 저하가 ZLib보다 심하지만, 압축 속도는 ZLib에 비해서 더욱 빨라집니다.  아래는 4KB 크기의 바이너리 데이터를 1024번 압축 한 결과 입니다.  역시 ZLib의 경우에는 가장 빠른 압축 옵션을 통해서 테스트 하였습니다.

  • Snappy --> SizeOut: 1905 B (46%), QueryPerformanceCounter: 1396
  • ZLib  --> SizeOut: 1516 B (37%), QueryPerformanceCounter: 281835




Posted by 류종택

Visual C++로 작성 된 http://ryulib.tistory.com/287 소스에 대한 델파이 버전입니다.  공유기가 UPnP를 지원 할 경우, 코딩으로 포트 포워딩을 해주는 유닛입니다.


[그림 1] 실행 결과




유닛 소스


http://goo.gl/PVIWTs




필요한 DLL


libPortForward.7z




DLL에 대한 소스  (VC++)


libPortForward.7z




사용법 (예제)

unit _fmMain;

interface

uses
  PortForward,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TfmMain = class(TForm)
    Panel1: TPanel;
    moMsg: TMemo;
    btOpen: TButton;
    btOpenUsingThread: TButton;
    procedure btOpenClick(Sender: TObject);
    procedure btOpenUsingThreadClick(Sender: TObject);
  private
    procedure do_WM_SetPortForwarding(var AMsg:TMessage); message WM_SetPortForwarding;
  public
  end;

var
  fmMain: TfmMain;

implementation

{$R *.dfm}

procedure TfmMain.btOpenClick(Sender: TObject);
var
  iErrorCode, ExternalPort : integer;
begin
  ExternalPort := 658;

  iErrorCode := SetPortForwarding( '192.168.10.13', 'Ryu', 658, ExternalPort );

  moMsg.Lines.Add( Format('iErrorCode=%d, , ExternalPort=%d', [iErrorCode, ExternalPort]) );
end;

procedure TfmMain.btOpenUsingThreadClick(Sender: TObject);
begin
  SetPortForwarding( Handle, '192.168.10.13', 'Ryu', 658, 658 );
end;

procedure TfmMain.do_WM_SetPortForwarding(var AMsg: TMessage);
begin
  moMsg.Lines.Add( Format('iErrorCode=%d, , ExternalPort=%d', [AMsg.WParam, AMsg.LParam]) );
end;

end.

6: 라인과 같이 PortForward 유닛을 추가합니다.


19: 라인은 비동기 식으로 처리 결과를 받고자 할 때 필요합니다.  함수를 호출하고 바로 결과를 얻고자 할 때는 필요 없습니다.  다만, 함수를 호출하고 바로 결과를 얻고자 할 때는 결과를 오랫 동안 기다려야 하는 경우도 발생합니다.


36: 라인에서는 SetPortForwarding 함수를 이용해서 '192.168.10.13' 주소의 내부 포트 658을 공유기의 외부 포트 658로 포워딩 해줍니다.  iErrorCode가 0 이면 성공이고 이외의 숫자는 모두 실패를 뜻 합니다.


43: 라인에서는 유사항 동작을 스레드를 이용해서 비동기식으로 결과를 알아옵니다.  결과는 메시지를 통해서 Handle 을 가지고 있는 객체에게 전달 됩니다.


48: SetPortForwarding의 결과가 메시지로 전달 되었습니다.  WParam에는 에러 코드가, LParam에는 실제 오픈 된 외부 포트가 전달 됩니다.


공유기의 외부 포트 658을 요청했다고 해도 반드시 658일 오픈되지는 않습니다.  이미 다른 곳에서 사용 중이라면 다른 포트가 오픈됩니다.



예제 전체 소스:   http://goo.gl/djcJtu






Posted by 류종택

unit _fmMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TfmMain = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    FSaveDwmCompositionEnabled : boolean;
  public
  end;

var
  fmMain: TfmMain;

implementation

uses
  DwmApi;

{$R *.dfm}

procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if FSaveDwmCompositionEnabled then
    DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
 FSaveDwmCompositionEnabled := DwmCompositionEnabled;
  if FSaveDwmCompositionEnabled then
    DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
end;

end.


24: uses 절에 DwmApi를 추가합니다.  델파이에 기본 제공됩니다.  (너무 낮은 버전에서는 제공 안됩니다)


36: 에어로 관련 API를 사용 할 수 있는 지 확인합니다.  윈도우 버전이 Vista 이하 인 경우 등에서는 사용이 불가능하기 때문에 해당 API가 제공되는 DLL을 로딩할 수 없습니다.


37-38: 사용 가능한 상태인 경우에는 에어로를 끕니다.


30-31: 프로그램이 종료 할 때, 이전에 저장된 플래그를 통해서 에어로가 사용 가능했었다면, 다시 되돌려 놓습니다.



Posted by 류종택
TAG Aero, Delphi

구글 코드가 문을 닫아서 깃허브로 옮겼습니다.

메일 문의가 와서 이제서야 알았네요.


Source: https://github.com/ryujt/ryulib4delphi



링크드 리스트를 이용해서 만든 큐를 제공하는 유닛입니다. 

  • 보다 나은 성능을 위해서 작성되었습니다.
    • 델파이에 기본 내장 된 큐 클래스가 TList를 이용하여 빈번하게 메모리 이동이 일어나는 문제 때문에 작성되었습니다.
  • 큐가 Full 상태에서 Push를 하게되면, 공간을 늘려서 저장하게 됩니다.  즉, Full 상태가 되는 일이 없습니다.
  • 쓰레드 세이프하도록 하기 위해서는 TDynamicQueue.Create(True)로 객체를 생성하시면 됩니다.


'RyuLib > RyuLib for Delphi' 카테고리의 다른 글

LazyRelease - 메모리 해제를 뒤로 미루기  (0) 2012.10.21
JsonFormatter unit 추가  (0) 2012.08.02
A Simple thread class that can change stack size for it  (0) 2012.07.01
DynamicQueue unit  (0) 2012.06.28
ThreadPool  (0) 2012.01.18
ObserverList  (0) 2010.12.13

Posted by 류종택
▶ 녹화자료보다 본방을 사수해야 하는 이유
  • 녹화자료는 화질이 선명하지 않습니다만, 본방은 아주 깨끗 합니다.
  • 강의 중에 언제든지 질문하실 수 있습니다.
  • 혼자 녹화자료 보는 것보다 학습동기 부여가 좋습니다.
  • 본방에 인원이 너무 저조하면 강사가 자극받아서 녹화자료를 오픈안할 수가 있습니다 ㅡ.ㅡ;

▶ 기타 주의사항
  • Warm-up Time은 강의 시간 운영에 의해서 생략될 수도 있습니다.
  • Main Session의 델파이와 안드로이드 강좌는 순서가 언제나 뒤바뀔 수 있습니다.

▶ 강의정보
  • 강의시간
    • 2010년 4월 26일 월요일 저녁 9시 30분 (1초도 안기다리고 그냥 강의 시작합니다)
  • 접속방법
    • http://ryujt.textcube.com/ 접속
    • 우측 상단에 있는 "강의실 들어가기" 클릭
    • 온라인 강의 프로그램 설치를 위해, Active-X를 사용합니다.  
    • 아이디/암호 아무거나 입력 (아이디는 커뮤니티 필명으로 해주세요)
    • 한 번 입력된 아이디 암호는 기억됩니다.  (서버 재부팅 하기 전까지)
  • 강의내용
    • Warm-up Time
      • 간략한 팁
      • 최대한 초보자도 이해할 수 있도록 쉬운 접근을 할 것 입니다.
      • 필요에 따라서는 구현설명이 아닌 사용/활용 방법 설명
    • Main Session #1 - Delphi
      • 간단한 채팅 프로그램 작성 #1
    • Main Session #2 - Android
      • 간단한 숫자 퍼즐 게임 만들기
      • 기념일 찾아내기
      • Android 개발환경은 각자가 준비하시기 바랍니다.  설치 등에 관한 내용은 강의하지 않습니다.

▶ 녹화자료
  • Delphi
    • 간단한 채팅 프로그래밍
    • 문자 채팅 이후 음성채팅 기능 등을 추가해서 꾸준히 강의할 예정입니다.
    • 우선 사용할 소켓 컴포넌트의 간략한 사용법 정도 입니다.
  • 안드로이드


Posted by 류종택


티스토리 툴바