मैं अपने प्रोजेक्ट में एक बहुत में इस्तेमाल करते हैं और मैं इन चेतावनियों के बहुत सारे है:CharInSet IN से बहुत धीमी है, क्या मुझे W1050 चेतावनी संकेत को ठीक करना चाहिए?
[डीसीसी चेतावनी] Unit1.pas (40): W1050 WideChar सेट भाव में बाइट चार को कम कर दिया। SysUtils इकाई में CharInSet फ़ंक्शन का उपयोग करने पर विचार करें।
if s1[i] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] then
बनाम
if CharInSet(s1[i], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']) then
यहाँ 2 परीक्षण, एक काम करता है के लिए कोड है:
मैं एक त्वरित परीक्षण और में के बजाय CharInSet उपयोग कर रहा है 65% से -100% धीमी कर दिया छोटे तारों के माध्यम से लूप के साथ, एक बार एक बड़ी स्ट्रिंग के माध्यम से एक लूप:
फ़ॉर्म पर 2 बटन जोड़कर मैंने इसे छोटी स्ट्रिंग के लिए परीक्षण किया:
procedure TForm1.Button1Click(Sender: TObject);
var s1: string;
t1, t2: TStopWatch;
a, i, cnt, vMaxLoop: Integer;
begin
s1 := '[DCC Warning] Unit1.pas(40): W1050 WideChar reduced to byte char in set expressions. Consider using CharInSet function in SysUtils unit.';
vMaxLoop := 10000000;
cnt := 0;
t1 := TStopWatch.Create;
t1.Start;
for a := 1 to vMaxLoop do
for i := 1 to Length(s1) do
if s1[i] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] then
inc(cnt);
t1.Stop;
cnt := 0;
t2 := TStopWatch.Create;
t2.Start;
for a := 1 to vMaxLoop do
for i := 1 to Length(s1) do
if CharInSet(s1[i], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']) then
inc(cnt);
t2.Stop;
Button1.Caption := inttostr(t1.ElapsedMilliseconds) + ' - ' + inttostr(t2.ElapsedMilliseconds);
end;
और इस के लिए 1 लंबी स्ट्रिंग:
procedure TForm1.Button2Click(Sender: TObject);
var s1: string;
t1, t2: TStopWatch;
a, i, cnt, vMaxLoop: Integer;
begin
s1 := '[DCC Warning] Unit1.pas(40): W1050 WideChar reduced to byte char in set expressions. Consider using CharInSet function in SysUtils unit.';
s1 := DupeString(s1, 1000000);
s1 := s1 + s1 + s1 + s1; // DupeString is limited, use this to create longer string
cnt := 0;
t1 := TStopWatch.Create;
t1.Start;
for i := 1 to Length(s1) do
if s1[i] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] then
inc(cnt);
t1.Stop;
cnt := 0;
t2 := TStopWatch.Create;
t2.Start;
for i := 1 to Length(s1) do
if CharInSet(s1[i], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']) then
inc(cnt);
t2.Stop;
Button2.Caption := inttostr(t1.ElapsedMilliseconds) + ' - ' + inttostr(t2.ElapsedMilliseconds);
end;
वे धीमी विकल्प क्यों की सिफारिश करते हैं, या कैसे मैं प्रदर्शन में दंड के बिना इस चेतावनी को ठीक कर सकते हैं?
http://stackoverflow.com/questions/332948/why-is-charinset-faster-than-case-statement – RBA
पर एक नज़र डालें, मैंने उस प्रश्न को देखा, लेकिन इसे शीर्षक के कारण खारिज कर दिया - सबकुछ रेड नहीं कर सकता । लेकिन, इसमें कुछ मूल्यवान जानकारी शामिल है। –
क्या कोई यह बता सकता है कि क्या यह चेतावनी प्रासंगिक है या नहीं? सेट में केवल असीसी वर्ण होते हैं और यदि 's1 [i]' एक विस्तृत चार है, तो डेल्फी win32 संकलक उस तुलना के लिए सही कोड उत्पन्न करता है। मैंने 's1: = 'Ł' की कोशिश की; अगर (एस 1 [1] ['ए'] में) तो ... ', क्योंकि' बाइट ('Ł') = 65 = बाइट ('ए') '। लेकिन इस तुलना के लिए संकलक सही कोड उत्पन्न करता है। – ventiseis