File.ls doesn’t appear to work with wildcards, I get this error `{:error, 
:enoent}`. But File.ls(“lib”) is also fast. The C script and NIF are beyond 
my knowledge.

On Monday, October 14, 2019 at 12:35:23 PM UTC-6, José Valim wrote:
>
> Right. Now try running File.ls in some directories and see if that is 
> enough to reproduce the issue. Then I would implement a C script that calls 
> ls as a NIF, see if it is fast or not. And so on.
>
>
> *José Valim*
> www.plataformatec.com.br
> Skype: jv.ptec
> Founder and Director of R&D
>
>
> On Mon, Oct 14, 2019 at 8:29 PM Michael St Clair <micha...@gmail.com 
> <javascript:>> wrote:
>
>> What is the best way to experiment with that? As I am showing that using 
>> the ls command is much faster (times below)
>>
>> On my Mac:
>>
>> iex(3)> fn -> Path.wildcard("lib/**/*.ex") end |> :timer.tc |> elem(0) 
>> |> Kernel./(1_000_000)
>>
>> 0.095601
>>
>> iex(4)> fn -> Path.wildcard("lib/**/*.ex") end |> :timer.tc |> elem(0) 
>> |> Kernel./(1_000_000)
>>
>> 0.071896
>>
>>
>> fn -> "ls lib/**/*.ex" |> String.to_charlist() |> :os.cmd() |> 
>> to_string() |> String.split("\n") end |> :timer.tc |> elem(0) |> 
>> Kernel./(1_000_000)
>>
>> 0.034176
>>
>> iex(6)> fn -> "ls lib/**/*.ex" |> String.to_charlist() |> :os.cmd() |> 
>> to_string() |> String.split("\n") end |> :timer.tc |> elem(0) |> 
>> Kernel./(1_000_000)
>>
>> 0.028481
>>
>>
>> On our production instance running docker (elixir:1.9.1-alpine):
>>
>> iex(zipbooks@phoenix-360h)1> fn -> Path.wildcard("lib/**/*.ex") end |> :
>> timer.tc |> elem(0) |> Kernel./(1_000_000)
>>
>> 0.448345
>>
>> iex(zipbooks@phoenix-360h)2> fn -> Path.wildcard("lib/**/*.ex") end |> :
>> timer.tc |> elem(0) |> Kernel./(1_000_000)
>>
>> 0.35429
>>
>>
>> iex(zipbooks@phoenix-360h)7> fn -> "ls lib/**/*.ex" |> 
>> String.to_charlist() |> :os.cmd() |> to_string() |> String.split("\n") end 
>> |> :timer.tc |> elem(0) |> Kernel./(1_000_000)
>>
>> 0.00361
>>
>> iex(zipbooks@phoenix-360h)8> fn -> "ls lib/**/*.ex" |> 
>> String.to_charlist() |> :os.cmd() |> to_string() |> String.split("\n") end 
>> |> :timer.tc |> elem(0) |> Kernel./(1_000_000)
>>
>> 0.003731
>>
>>
>> Local docker container with mounted directories(elixir:1.9.1-alpine):
>>
>> iex(1)> fn -> Path.wildcard("lib/**/*.ex") end |> :timer.tc |> elem(0) 
>> |> Kernel./(1_000_000)   
>>
>> 0.881692
>>
>> iex(2)> fn -> Path.wildcard("lib/**/*.ex") end |> :timer.tc |> elem(0) 
>> |> Kernel./(1_000_000)
>>
>> 0.897629
>>
>>
>> fn -> "ls lib/**/*.ex" |> String.to_charlist() |> :os.cmd() |> 
>> to_string() |> String.split("\n") end |> :timer.tc |> elem(0) |> 
>> Kernel./(1_000_000)
>>
>> 0.031227
>>
>> iex(4)> fn -> "ls lib/**/*.ex" |> String.to_charlist() |> :os.cmd() |> 
>> to_string() |> String.split("\n") end |> :timer.tc |> elem(0) |> 
>> Kernel./(1_000_000)
>>
>> 0.031241
>>
>> On Monday, October 14, 2019 at 12:14:57 PM UTC-6, José Valim wrote:
>>>
>>> There is no way to patch out Mix.Utils to run your own code. The proper 
>>> fix would be to figure out why the path traversal is slow on Elixir (it is 
>>> implemented on top of filelib:wildcard) so we can fix it rather 
>>> permanently. How long does "Path.wildcard("lib/**/*.ex")" take? Can you 
>>> implement your own path traversal in Elixir? Is it faster than 
>>> Path.wildcard?
>>>
>>>
>>> *José Valim*
>>> www.plataformatec.com.br
>>> Skype: jv.ptec
>>> Founder and Director of R&D
>>>
>>>
>>> On Mon, Oct 14, 2019 at 8:08 PM Michael St Clair <micha...@gmail.com> 
>>> wrote:
>>>
>>>> I've been doing some digging around to see how to make phoenix run 
>>>> faster in Docker. Without this plug the app runs just as fast as native 
>>>> `plug(Phoenix.CodeReloader`. I think I have traced it down to this 
>>>> https://github.com/elixir-lang/elixir/blob/master/lib/mix/lib/mix/utils.ex#L237.
>>>>  
>>>> Running just that function explains most if not all of the extra load time 
>>>> on my endpoints. However this code `"ls lib/**/*.ex" |> 
>>>> String.to_charlist() |> :os.cmd() |> to_string() |> String.split("\n") |> 
>>>> IO.inspect` appears to do the same thing and much faster. I'm just running 
>>>> into the problem of how to override that Mix.Utils file to test it here 
>>>> https://github.com/elixir-lang/elixir/blob/master/lib/mix/lib/mix/compilers/elixir.ex#L36.
>>>>  
>>>> Any suggestions?
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "elixir-lang-core" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to elixir-l...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/elixir-lang-core/b811d808-04a2-427e-9281-3d337f05de16%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/elixir-lang-core/b811d808-04a2-427e-9281-3d337f05de16%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-l...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/b46f9a3c-4f0a-479d-98df-a921ffeb65fc%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/b46f9a3c-4f0a-479d-98df-a921ffeb65fc%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/13ce15ce-7bad-468a-84c5-10be4044935c%40googlegroups.com.

Reply via email to