198 lines
4.9 KiB
ObjectPascal
198 lines
4.9 KiB
ObjectPascal
unit uTest;
|
||
|
||
interface
|
||
|
||
uses
|
||
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, System.DateUtils,
|
||
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls, uIdGeneratorOptions, uIIdGenerator,
|
||
uDefaultIdGenerator, uYitIdHelper;
|
||
|
||
type
|
||
TfTest = class(TForm)
|
||
mmo1: TMemo;
|
||
Panel1: TPanel;
|
||
Button1: TButton;
|
||
btnTimeStamp: TButton;
|
||
Button2: TButton;
|
||
rgSelect: TRadioGroup;
|
||
procedure Button1Click(Sender: TObject);
|
||
procedure btnTimeStampClick(Sender: TObject);
|
||
procedure Button2Click(Sender: TObject);
|
||
procedure FormCreate(Sender: TObject);
|
||
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
||
private
|
||
{ Private declarations }
|
||
IdGeneratorOption: TIdGeneratorOptions;
|
||
YitIdHelper: TYitIdHelper;
|
||
public
|
||
{ Public declarations }
|
||
end;
|
||
|
||
var
|
||
fTest: TfTest;
|
||
|
||
implementation
|
||
|
||
{$R *.dfm}
|
||
|
||
function GetMillisecondTimeStamp(): Int64;
|
||
var
|
||
ST: TDateTime;
|
||
begin
|
||
ST := EncodeDateTime(1970, 1, 1, 0, 0, 0, 0);
|
||
Result := MilliSecondsBetween(Now(), ST) - 28800000; // 8*60*60*1000;
|
||
end;
|
||
|
||
procedure TfTest.btnTimeStampClick(Sender: TObject);
|
||
const
|
||
T1 = 28800000;
|
||
var
|
||
SysTime: TSystemTime;
|
||
Time1, Time2: TDateTime;
|
||
T2, T3: Int64;
|
||
begin
|
||
// 秒级
|
||
// mmo1.Lines.Add(IntToStr(DateTimeToUnix(EncodeDateTime(2020, 2, 20, 2, 20, 2, 20), False)));
|
||
// mmo1.Lines.Add(IntToStr(DateTimeToUnix(EncodeDateTime(2020, 2, 20, 2, 20, 2, 20), True)));
|
||
// mmo1.Lines.Add(FormatDateTime('yyyy-MM-dd HH:mm:ss.zzz',
|
||
// UnixToDateTime(DateTimeToUnix(EncodeDateTime(2020, 2, 20, 2, 20, 2, 20), False), False)));
|
||
mmo1.Lines.Add('处理时区后转为UTC时间:' + IntToStr(DateTimeToUnix(Now(), False)));
|
||
mmo1.Lines.Add('直接取UTC时间:' + IntToStr(DateTimeToUnix(Now(), True)));
|
||
// mmo1.Lines.Add(FormatDateTime('yyyy-MM-dd HH:mm:ss.zzz', UnixToDateTime(DateTimeToUnix(Now(), False), False)));
|
||
// mmo1.Lines.Add(FormatDateTime('yyyy-MM-dd HH:mm:ss.zzz', UnixToDateTime(DateTimeToUnix(Now(), True), True)));
|
||
|
||
// 毫秒级
|
||
Time2 := EncodeDateTime(1970, 1, 1, 0, 0, 0, 0);
|
||
|
||
// 未处理时区
|
||
GetLocalTime(SysTime);
|
||
Time1 := SystemTimeToDateTime(SysTime);
|
||
T2 := MilliSecondsBetween(Time1, Time2);
|
||
T3 := T2 - T1;
|
||
mmo1.Lines.Add('LocalTime:' + IntToStr(T3));
|
||
|
||
// 处理了时区
|
||
GetSystemTime(SysTime);
|
||
Time1 := SystemTimeToDateTime(SysTime);
|
||
T2 := MilliSecondsBetween(Time1, Time2);
|
||
T3 := T2 - T1;
|
||
mmo1.Lines.Add('SystemTime:' + IntToStr(T3));
|
||
|
||
// 未处理时区
|
||
Time1 := Now();
|
||
T2 := MilliSecondsBetween(Time1, Time2);
|
||
T3 := T2 - T1;
|
||
mmo1.Lines.Add('Now:' + IntToStr(T3));
|
||
end;
|
||
|
||
procedure TfTest.Button1Click(Sender: TObject);
|
||
var
|
||
options: TIdGeneratorOptions;
|
||
IdGen: IIdGenerator;
|
||
i, j: Integer;
|
||
begin
|
||
// 使用方式一:直接使用
|
||
options := TIdGeneratorOptions.Create;
|
||
try
|
||
with options do
|
||
begin
|
||
Method := rgSelect.ItemIndex + 1;
|
||
// BaseTime := DateTime.Now.AddYears(-10);
|
||
WorkerId := 2;
|
||
|
||
WorkerIdBitLength := 6;
|
||
SeqBitLength := 6;
|
||
|
||
MaxSeqNumber := 0;
|
||
MinSeqNumber := 5;
|
||
|
||
TopOverCostCount := 2000;
|
||
|
||
DataCenterId := 0;
|
||
DataCenterIdBitLength := 0;
|
||
|
||
TimestampType := 0;
|
||
end;
|
||
|
||
IdGen := TDefaultIdGenerator.Create(options);
|
||
|
||
j := 100;
|
||
Screen.Cursor := crHourGlass;
|
||
mmo1.Lines.BeginUpdate();
|
||
try
|
||
for i := 1 to j do
|
||
begin
|
||
mmo1.Lines.Add(FormatFloat('000', i) + ':' + IntToStr(IdGen.NewLong()));
|
||
end;
|
||
mmo1.Perform(WM_VSCROLL, SB_BOTTOM, 0)
|
||
finally
|
||
mmo1.Lines.EndUpdate();
|
||
Screen.Cursor := crDefault;
|
||
end;
|
||
|
||
finally
|
||
options.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TfTest.Button2Click(Sender: TObject);
|
||
const
|
||
Total = 5000000;
|
||
var
|
||
i: Integer;
|
||
Id: Int64;
|
||
ST, ET, Elapse: Cardinal;
|
||
begin
|
||
Screen.Cursor := crHourGlass;
|
||
try
|
||
ST := GetTickCount();
|
||
for i := 1 to Total do
|
||
begin
|
||
Id := YitIdHelper.NextId();
|
||
end;
|
||
ET := GetTickCount();
|
||
finally
|
||
Screen.Cursor := crDefault;
|
||
end;
|
||
Elapse := ET - ST;
|
||
mmo1.Lines.Add(Format('生成500万个时间:%d毫秒,平均每秒%d个。', [Elapse, Trunc((Total / Elapse) * 1000)]));
|
||
|
||
end;
|
||
|
||
procedure TfTest.FormClose(Sender: TObject; var Action: TCloseAction);
|
||
begin
|
||
YitIdHelper.Free;
|
||
IdGeneratorOption.Free;
|
||
end;
|
||
|
||
procedure TfTest.FormCreate(Sender: TObject);
|
||
begin
|
||
IdGeneratorOption := TIdGeneratorOptions.Create;
|
||
// 默认参数
|
||
with IdGeneratorOption do
|
||
begin
|
||
Method := rgSelect.ItemIndex + 1;
|
||
// BaseTime := DateTime.Now.AddYears(-10);
|
||
WorkerId := 2;
|
||
|
||
WorkerIdBitLength := 6;
|
||
SeqBitLength := 6;
|
||
|
||
MaxSeqNumber := 0;
|
||
MinSeqNumber := 5;
|
||
|
||
TopOverCostCount := 2000;
|
||
|
||
DataCenterId := 0;
|
||
DataCenterIdBitLength := 0;
|
||
|
||
TimestampType := 0;
|
||
end;
|
||
|
||
// 使用方式二:封装类使用
|
||
YitIdHelper := TYitIdHelper.Create;
|
||
YitIdHelper.SetIdGenerator(IdGeneratorOption);
|
||
end;
|
||
|
||
end.
|