If this benchmark is correct:
require "benchmark"
def def_stream(*args : String) : String
args.join
end
macro macro_stream(*args)
String.build do |io|
io {% for arg in args %} << {{arg}} {% end %}
end
end
Benchmark.ips do |x|
x.report "def_stream" do
def_stream(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"Phasellus nec sem id quam placerat viverra vel non urna.",
"In quis odio et erat feugiat fermentum vitae id nibh.",
"Sed sed erat et sem aliquet placerat posuere egestas est.",
"Aenean at lectus rutrum, condimentum sem quis, cursus arcu.",
"Nullam ac tortor pretium, scelerisque ex vel, ullamcorper felis.",
"Quisque accumsan urna sed feugiat dignissim.",
"Sed mattis lacus vitae felis tempus facilisis non a ipsum.",
"Pellentesque suscipit tortor non quam mollis feugiat.",
"Ut cursus lacus ac tellus gravida, eget bibendum mi hendrerit.",
"Quisque eu est et libero volutpat dapibus.",
"Aliquam lobortis urna viverra justo congue molestie.",
"Maecenas efficitur nibh quis diam elementum, nec varius justo pulvinar.",
"Donec et est bibendum, vehicula augue ut, tempor mi.",
"Phasellus eget risus tincidunt, egestas ex in, tristique neque.",
"Donec consectetur tellus quis consequat ullamcorper.",
"Nullam sollicitudin augue nec lacus porta consequat.",
"Fusce aliquam libero in orci semper, nec viverra enim elementum.",
"Praesent mollis turpis vitae ex suscipit fringilla.",
"Sed luctus tortor et odio lacinia, et feugiat augue vestibulum.",
)
end
x.report "def_stream" do
macro_stream(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"Phasellus nec sem id quam placerat viverra vel non urna.",
"In quis odio et erat feugiat fermentum vitae id nibh.",
"Sed sed erat et sem aliquet placerat posuere egestas est.",
"Aenean at lectus rutrum, condimentum sem quis, cursus arcu.",
"Nullam ac tortor pretium, scelerisque ex vel, ullamcorper felis.",
"Quisque accumsan urna sed feugiat dignissim.",
"Sed mattis lacus vitae felis tempus facilisis non a ipsum.",
"Pellentesque suscipit tortor non quam mollis feugiat.",
"Ut cursus lacus ac tellus gravida, eget bibendum mi hendrerit.",
"Quisque eu est et libero volutpat dapibus.",
"Aliquam lobortis urna viverra justo congue molestie.",
"Maecenas efficitur nibh quis diam elementum, nec varius justo pulvinar.",
"Donec et est bibendum, vehicula augue ut, tempor mi.",
"Phasellus eget risus tincidunt, egestas ex in, tristique neque.",
"Donec consectetur tellus quis consequat ullamcorper.",
"Nullam sollicitudin augue nec lacus porta consequat.",
"Fusce aliquam libero in orci semper, nec viverra enim elementum.",
"Praesent mollis turpis vitae ex suscipit fringilla.",
"Sed luctus tortor et odio lacinia, et feugiat augue vestibulum.",
)
end
end
Then yes, the macro version is 3x slower than the method version:
$ crystal run --release test.cr
def_stream 11.70M ( 85.46ns) (± 2.61%) 1.31kB/op fastest
macro_stream 3.56M (281.24ns) (± 1.44%) 5.78kB/op 3.29× slower