less than 1 minute read

defp ask_and_schedule(producers, from) do
  case producers do
    %{^from => {pending, interval}} ->
    # ...
    %{} ->
    # ...
  end
end

GenStage 코드를 보다가 발견했다. Map.get(producers, from) 혹은 producers[from] 으로 값을 가져오는 게 아니라 패턴 매칭을 사용한다.

Map.get/3 함수보다 빠를까?

defmodule Map do
  def get(map, key, default \\ nil) do
    case map do
      %{^key => value} ->
        value

      %{} ->
        default

      other ->
        :erlang.error({:badmap, other}, [map, key, default])
    end
  end
end

당연. 빠를 수밖에 없다. Map.get/3 함수를 패턴 매칭으로 구현했다. 패턴 매칭이 더 근본이다. 하지만 크게 의미있는 속도 차이는 없으니 가독성을 보고 선택하면 된다.