The extension trait will be monomorphized, i.e. a copy will be generated for each type it is used with. This generally means faster code, because the compiler can see the definition of the functions in MyTrait that it calls. However more code generated (which can bloat the executable). It is generally considered the preferred way, though that doesn't necessarily mean it's better. Also it works for non-object safe traits and methods, for example your fn some_extension(self) cannot be written with impl dyn MyTrait + '_ because it takes self, which requires Self: Sized but dyn MyTrait + '_ is not Sized.