Instancing does not always win. This is a kind of optimization that needs to be profiled to see if it is worth doing.
In general, instancing is a victory if you render a lot of instances (1000 is a bit, but not enough. Think 10,000) that contain a small number of vertices (20,000, probably too many. -3000 or so). In addition, your data for each instance is unnecessarily large; you use a matrix when you can easily use a vector and a quaternion.
The purpose of instance is to reduce processor overhead. In particular, CPU overhead per call and state change. With 20 million peaks, the chances that the processor overhead per 1000 calls and state changes are not your biggest problem.
source share