প্রদত্ত উত্তরে ইতিমধ্যে অনেক ভাল পন্থা রয়েছে ( এখানে , এখানে এবং এখানে )। গতি যদি আপনি প্রাথমিকভাবে সন্ধান করেন তবে লুয়ার সিআই এপিআইয়ের মাধ্যমে আপনার কাজটি অবশ্যই করা উচিত, যা কাঁচা লুয়া কোডের চেয়ে বহুগুণ দ্রুত। প্রিলোডেড খণ্ডগুলি (যেমন লোড ফাংশন ) নিয়ে কাজ করার সময়, পার্থক্যটি এত বড় নয়, তবে এখনও যথেষ্ট বিবেচ্য।
খাঁটি লুয়া সমাধানগুলির জন্য , আমি তৈরি করেছি এই ছোট্ট বেঞ্চমার্কটি ভাগ করুন। এটি এই তারিখের প্রতি প্রদত্ত উত্তরকে কভার করে এবং কয়েকটি অপ্টিমাইজেশন যুক্ত করে। তবুও, বিবেচনার জন্য মূল বিষয়টি হ'ল:
স্ট্রিংয়ে অক্ষরগুলি দিয়ে পুনরাবৃত্তি করার জন্য আপনার কতবার দরকার?
- উত্তরটি যদি একবার "একবার" হয় তবে তার চেয়ে বেশি আপনার ব্যাঙ্কমার্কের প্রথম অংশটি দেখা উচিত ("কাঁচা গতি")।
- অন্যথায়, দ্বিতীয় অংশটি আরও সুনির্দিষ্ট প্রাক্কলন সরবরাহ করবে, কারণ এটি টেবিলের মধ্যে স্ট্রিংটিকে পার্স করে, যা পুনরাবৃত্তি করা আরও দ্রুত। আপনার পক্ষে এইটির জন্য একটি সাধারণ ক্রিয়া লেখার কথাও বিবেচনা করা উচিত, যেমন @ জারিজ প্রস্তাবিত।
এখানে পূর্ণ কোড:
local str = "Hello World!"
local attempts = 5000000
local reuses = 10
local x, c, elapsed, tbl
local stringbyte, stringchar, stringsub, stringgsub, stringgmatch = string.byte, string.char, string.sub, string.gsub, string.gmatch
print("-----------------------")
print("Raw speed:")
print("-----------------------")
x = os.clock()
for j = 1, attempts do
for i = 1, #str do
c = stringsub(str, i)
end
end
elapsed = os.clock() - x
print(string.format("V1: elapsed time: %.3f", elapsed))
x = os.clock()
for j = 1, attempts do
for c in stringgmatch(str, ".") do end
end
elapsed = os.clock() - x
print(string.format("V2: elapsed time: %.3f", elapsed))
x = os.clock()
for j = 1, attempts do
stringgsub(str, ".", function(c) end)
end
elapsed = os.clock() - x
print(string.format("V3: elapsed time: %.3f", elapsed))
local str2table = function(str)
local ret = {}
for i = 1, #str do
ret[i] = stringsub(str, i)
end
return ret
end
x = os.clock()
for j = 1, attempts do
tbl = str2table(str)
for i = 1, #tbl do
c = tbl[i]
end
end
elapsed = os.clock() - x
print(string.format("V4: elapsed time: %.3f", elapsed))
x = os.clock()
for j = 1, attempts do
tbl = {stringbyte(str, 1, #str)}
for i = 1, #tbl do
c = tbl[i]
end
end
elapsed = os.clock() - x
print(string.format("V5: elapsed time: %.3f", elapsed))
x = os.clock()
for j = 1, attempts do
tbl = {stringbyte(str, 1, #str)}
for i = 1, #tbl do
c = stringchar(tbl[i])
end
end
elapsed = os.clock() - x
print(string.format("V5b: elapsed time: %.3f", elapsed))
print("-----------------------")
print("Creating cache table ("..reuses.." reuses):")
print("-----------------------")
x = os.clock()
for k = 1, attempts do
tbl = {}
for i = 1, #str do
tbl[i] = stringsub(str, i)
end
for j = 1, reuses do
for i = 1, #tbl do
c = tbl[i]
end
end
end
elapsed = os.clock() - x
print(string.format("V1: elapsed time: %.3f", elapsed))
x = os.clock()
for k = 1, attempts do
tbl = {}
local tblc = 1
for c in stringgmatch(str, ".") do
tbl[tblc] = c
tblc = tblc + 1
end
for j = 1, reuses do
for i = 1, #tbl do
c = tbl[i]
end
end
end
elapsed = os.clock() - x
print(string.format("V2: elapsed time: %.3f", elapsed))
x = os.clock()
for k = 1, attempts do
tbl = {}
local tblc = 1
stringgsub(str, ".", function(c)
tbl[tblc] = c
tblc = tblc + 1
end)
for j = 1, reuses do
for i = 1, #tbl do
c = tbl[i]
end
end
end
elapsed = os.clock() - x
print(string.format("V3: elapsed time: %.3f", elapsed))
x = os.clock()
for k = 1, attempts do
tbl = str2table(str)
for j = 1, reuses do
for i = 1, #tbl do
c = tbl[i]
end
end
end
elapsed = os.clock() - x
print(string.format("V4: elapsed time: %.3f", elapsed))
x = os.clock()
for k = 1, attempts do
tbl = {stringbyte(str,1,#str)}
for j = 1, reuses do
for i = 1, #tbl do
c = tbl[i]
end
end
end
elapsed = os.clock() - x
print(string.format("V5: elapsed time: %.3f", elapsed))
x = os.clock()
for k = 1, attempts do
tbl = {stringbyte(str, 1, #str)}
for i = 1, #tbl do
tbl[i] = stringchar(tbl[i])
end
for j = 1, reuses do
for i = 1, #tbl do
c = tbl[i]
end
end
end
elapsed = os.clock() - x
print(string.format("V5b: elapsed time: %.3f", elapsed))
উদাহরণ আউটপুট (লুয়া 5.3.4, উইন্ডোজ) :
Raw speed:
V1: elapsed time: 3.713
V2: elapsed time: 5.089
V3: elapsed time: 5.222
V4: elapsed time: 4.066
V5: elapsed time: 2.627
V5b: elapsed time: 3.627
Creating cache table (10 reuses):
V1: elapsed time: 20.381
V2: elapsed time: 23.913
V3: elapsed time: 25.221
V4: elapsed time: 20.551
V5: elapsed time: 13.473
V5b: elapsed time: 18.046
ফলাফল:
আমার ক্ষেত্রে, string.byte
এবং string.sub
কাঁচা গতির দিক থেকে দ্রুততম ছিল। ক্যাশে টেবিল ব্যবহার করার সময় এবং প্রতি লুপে 10 বার এটি পুনরায় ব্যবহার করার সময়,string.byte
চারকোডগুলি চরগুলিতে ফিরে রূপান্তর করার সময়ও সংস্করণটি দ্রুত ছিল (যা সর্বদা প্রয়োজনীয় নয় এবং ব্যবহারের উপর নির্ভর করে)।
আপনি সম্ভবত লক্ষ্য করেছেন, আমি আমার পূর্ববর্তী মানদণ্ডের উপর ভিত্তি করে কিছু অনুমান করেছি এবং সেগুলি কোডে প্রয়োগ করেছি:
- লুপের অভ্যন্তরে ব্যবহৃত হলে লাইব্রেরির ফাংশনগুলি সর্বদা স্থানীয় করা উচিত, কারণ এটি অনেক দ্রুত।
- লুয়া টেবিলের মধ্যে নতুন উপাদান সন্নিবেশ করা এর
tbl[idx] = value
চেয়ে বেশি দ্রুত table.insert(tbl, value)
।
- টেবিল ব্যবহার করে লুপিং এর
for i = 1, #tbl
চেয়ে কিছুটা দ্রুতfor k, v in pairs(tbl)
।
- সর্বদা কম ফাংশন কল সহ সংস্করণ পছন্দ করুন, কারণ কলটি নিজেই সম্পাদনের সময়টিতে কিছুটা যুক্ত করে।
আশা করি এটা সাহায্য করবে.