読者です 読者をやめる 読者になる 読者になる

mmag

ハマったことメモなど

遅いと思ったらとりあえずspawn

以前にも書いたようにRails Tutorialをphoenixでやってたやつをまたちょいちょい書いている。

その中で、seedでダミーのユーザを100人つくるというのがあった。かなり前にseedつくる用のパッケージ書いたなと思い出してメンテしてねぇやべぇとおもったけど、素直にchangesetからのinsert!でやることにした。

## priv/repo/seeds.exs

alias PhMicroblog.{User, Repo}

defmodule Helper do
  def insert_user!(name, email, password) do
    params = %{
      name: name,
      email: email,
      password: password,
      password_confirmation: password
    }

    %User{} |> User.changeset(params) |> Repo.insert!
  end
end

Faker.start

Helper.insert_user!("Example User", "example@railstutorial.org", "foobar")

Enum.each 1..99, fn i ->
  Helper.insert_user!(Faker.Name.name, "example-#{i}@railstutorial.org", "password")
end

mix ecto.setupすればマイグレーションとかした後これが走る。やってみたらこれがまた遅い。すげー遅い。

こんな遅かったっけ?と思いながらおもむろにspawn

Enum.each 1..99, fn i ->
  spawn fn ->
    Helper.insert_user!(Faker.Name.name, "example-#{i}@railstutorial.org", "password")
  end
end

結構速くなった。3倍くらい。

# before
$ time mix ecto.setup
mix ecto.setup  37.82s user 0.85s system 98% cpu 39.451 total

# after
$ time mix ecto.setup
mix ecto.setup  38.84s user 0.74s system 302% cpu 13.105 total

カジュアルに並行にできるのよいすな。

ただこれやると、"example-#{i}@railstutorial.org"iとauto incrementのidがバラバラになるんで、そこは注意。

テーマはFB matteをベースにしてます。作者さんに感謝を込めて。