प्रदान किए गए उत्तरों ( यहां , यहां और यहां ) में पहले से ही बहुत अच्छे दृष्टिकोण हैं । यदि गति वह है जो आप मुख्य रूप से देख रहे हैं, तो आपको निश्चित रूप से लुआ के सी एपीआई के माध्यम से काम करने पर विचार करना चाहिए, जो कच्चे लुआ कोड की तुलना में कई गुना तेज है। प्रीलोडेड चंक्स के साथ काम करते समय (जैसे लोड फंक्शन ), अंतर उतना बड़ा नहीं होता है, लेकिन फिर भी काफी होता है।
के रूप में शुद्ध लुआ समाधान,, मैं कर दिया है मुझे इस छोटे से बेंचमार्क साझा करते हैं। यह इस तिथि तक हर उपलब्ध उत्तर को कवर करता है और कुछ अनुकूलन जोड़ता है। फिर भी, मूल बात यह है कि:
स्ट्रिंग में वर्णों पर पुनरावृति करने के लिए आपको कितनी बार आवश्यकता होगी?
- यदि उत्तर "एक बार" है, तो आपको बैंचमार्क ("कच्ची गति") के पहले भाग को देखना चाहिए।
- अन्यथा, दूसरा भाग अधिक सटीक अनुमान प्रदान करेगा, क्योंकि यह स्ट्रिंग को तालिका में पार्स करता है, जो कि अधिक से अधिक पुनरावृति करना है। आपको इसके लिए एक सरल कार्य लिखने पर भी विचार करना चाहिए, जैसे @ जरीज़ ने सुझाव दिया।
यहाँ पूर्ण कोड है:
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))
उदाहरण आउटपुट (Lua 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)
।
- हमेशा कम फ़ंक्शन कॉल वाले संस्करण को प्राथमिकता दें, क्योंकि कॉल ही निष्पादन के समय में थोड़ा सा जोड़ता है।
आशा करता हूँ की ये काम करेगा।