I just implemented some telemetry in a library that should be usable in hot paths (but likely has more expensive costs than the telemetry path) and I didn’t use any of the Elixir wrappers to the Erlang module functions, but called them directly.
https://github.com/KineticCafe/app_identity/pull/3 Do we need this? -a On Fri, Nov 4, 2022 at 4:49 PM Mat Trudel <m...@geeky.net> wrote: > Using tools such as telemetry in a performant manner requires access to > some sort of low cost timing primitive to be able to calculate intervals. > The community seems to use a mixture of `System.system_time/0` and/or > `System.monotinic_time/0` to accomplish this, though neither of these are > built specifically for purpose, and neither are terribly performant on > super hot paths [1]. > > As it turns out, Erlang provides a tool for exactly this purpose, though > Elixir doesn't expose it natively. That tool is `:os.perf_counter/1`: > https://www.erlang.org/doc/man/os.html#perf_counter-1 > > It would be good to have first-class access to this in Elixir. Therefore, > it is proposed to add the following to System: > > * Add `System.perf_counter/0` & `System.perf_counter/1` as thin wrappers > around `:os.perf_counter`, in the same manner as is currently done for > `System.system_time` et al > > * Add support for `perf_counter` to `System.convert_time_unit/3`. This is > already supported in the underlying `:erlang.convert_time_unit/3`, it's > just a matter of adding a clause to the private `normalize_time_unit` > function. > > Combined, these will allow for *significantly* faster interval > calculation, which should help speed up all sorts of hot telemetry paths. > > In practice, `perf_counter` is about twice as fast as `system_time`. A > quick comparison (run on an M1 MacBook Air running 1.14/OTP 25.1): > > ``` > Mix.install([{:benchee, "~> 1.0", only: :dev}]) > > Benchee.run(%{ > system_time: &System.system_time/0, > monotonic_time: &System.monotonic_time/0, > perf_counter: &:os.perf_counter/0 > }) > > Name ips average deviation median > 99th % > perf_counter 54.03 M 18.51 ns ±439.35% 18.33 ns > 20.01 ns > monotonic_time 28.10 M 35.58 ns ±2758.64% 33.30 ns > 41.70 ns > system_time 23.44 M 42.67 ns ±8964.02% 37.50 ns > 45.90 ns > > Comparison: > perf_counter 54.03 M > monotonic_time 28.10 M - 1.92x slower +17.08 ns > system_time 23.44 M - 2.31x slower +24.16 ns > ``` > > If folks are onboard I can get this implemented immediately. > > m. > > [1] https://github.com/mtrudel/thousand_island/issues/1, among others > > -- > 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/9d4111e5-4799-4781-bbf1-43dae14dcb94n%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/9d4111e5-4799-4781-bbf1-43dae14dcb94n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- Austin Ziegler • halosta...@gmail.com • aus...@halostatue.ca http://www.halostatue.ca/ • http://twitter.com/halostatue -- 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/CAJ4ekQvyxj%2BREK_9%2BUdCjFUa0y72i2%2Bnn-8YpOCONCKeJRpq2g%40mail.gmail.com.