Simüle yazım üreten bir programım var. Program, dosyanın konumunu ve uzantı ile birlikte dosyanın bulunduğu kullanıcı girişini alır. Daha sonra dosyayı bir yineleme kullanarak bozar ve bir diziye koyar. Program çalıştığındaRuby Arrays veya Hashes'ı Optimize Etme
def file_to_array(file)
empty = []
File.foreach("#{file}") do |line|
empty << line.to_s.split('')
end
return empty.flatten!
end
, bu win32ole
yoluyla yazmaya teşvik etmek için metin alanına tuşları gönderir.
5.000 karakterden sonra fazla bellek yükü var ve program yavaşlamaya başlar. Daha geç 5000 karakter, daha yavaş gider. Bunun optimize edilebilmesi için bir yolu var mı?
--EDIT--
require 'Benchmark'
def file_to_array(file)
empty = []
File.foreach(file) do |line|
empty << line.to_s.split('')
end
return empty.flatten!
end
def file_to_array_2(file)
File.read(file).split('')
end
file = 'xxx'
Benchmark.bm do |results|
results.report { print file_to_array(file) }
results.report { print file_to_array_2(file) }
end
user system total real
0.234000 0.000000 0.234000 ( 0.787020)
0.218000 0.000000 0.218000 ( 1.917185)
Doğru bir şekilde bağımsız mıyım - boş 'dizi' öğe başına bir karakter mi saklıyor? Sadece metni depolamayı ve 'each_char' kullanarak yinelemeyi düşündünüz mü? (Ya da, hiç saklamıyor, ama filin içinde bırakmıyor ...?) –
@ Aetherus'un önerilerine dayanan böyle bir yöntem kullanarak alternatif bir yöntem yazdım ama bunu test ettiğimde, bellek yaklaşık 7.000 karakterler ve böylece program yavaşlamaya başladı.Şu anda bu kod snippet'inde kullandığım yöntem yaklaşık 5.000 karakterde yavaşlıyor. Bu bir gelişme, ama yeterli değil. Optimizasyon için baktığım şey sayesinde, sistem stresini yarıya indirmeyi başardım. Tam koduna buradan bakabilirsiniz. https://github.com/sinithwar/LazyProjects/blob/master/RubyTypingSim.rb –