Şu anda Elixir'i öğrenmekle çok ilgileniyorum ve yeni bir dil öğrenmeye yönelik tipik yaklaşımım, basit programlar geliştirmektir.Bu Elixir kodu neden bu kadar yavaş?
defmodule LineMatch do
def file(s, path) do
case File.open(path, [:read]) do
{:ok, fd} -> match s, fd
{_, error} -> IO.puts "#{:file.format_error error}"
end
end
defp match(s, fd) do
case IO.read fd, :line do
{:error, error} -> IO.puts("oh noez! Error: #{error}")
line -> match(s, line, fd)
end
end
defp match(s, line, fd) when line !== :eof do
if String.contains?(line, s) do
IO.write line
end
match(s, IO.read(fd, :line), fd)
end
defp match(_, _line, _) when _line === :eof do
end
end
Bunu yapmanın en zarif yolu büyük olasılıkla değil ve ben:
Yani burada gösterilmektedir bir (çok basit) grep benzeri bir program (veya modül) yazmaya karar Ayrıca işlevsel programlama için oldukça yeni, bu yüzden süper hızlı olmasını beklemiyordum. Ama bu sadece hızlı değil, aslında süper yavaş. O kadar yavaş ki, muhtemelen süper bir hata yaptım.Herkes bana ne olduğunu ve nasıl daha iyi hale getirebileceğini söyleyebilir mi?
Genellikle Aksine lad2025 yanıtında olduğu gibi bütün dosyasında okuma daha
case System.argv do
[searchTerm, path] -> LineMatch.file(searchTerm, path)
_ -> IO.puts "Usage: lineMatch searchTerm path"
end
Çok ayrıntılı yanıtınız için teşekkür ederiz! Önerinizi kesinlikle deneyeceğim. Örnek veriler oluşturmak için http://www.generatedata.com/ adresini kullandım. Hala bunun neden yavaş olduğunu merak ediyorum. Tabii, UTF-8 dönüşümü yavaşlatıyor ama 500 ms'de bir satır gibi çıktı aldım. – koehr
Gerçekten UTF-8 dönüşüm olduğundan şüpheliyim. Her I/O işlemi iksirdeki işlemler arasında bir mesaj olduğundan, File.read aracılığıyla dosyalarla çalışmak çok yavaştır. Büyük bir parçayı okumak ve sonra bu tekli ikiliyi ayrıştırmak neredeyse her zaman daha hızlıdır. –