I rewrote some of the unit code to fix the performance regression, and it seems it suffers not only from poor performance, but also design problems.
1. There is no way to convert a length such as "45%" or "12em" into user units without additional information: the x-height, font size and the current viewbox. The new code is in fact worse in this respect than SVGLength, because the latter does have an update() method which allows one to provide this information. Calling value("px") on a Quantity defined in em can give the correct result only by accident.
2. The same class is used to represent radial and linear values, and warnings are emitted at runtime when those two are mixed. This kind of checking should definitely be done at compile time, by using Geom::Angle for radial values.
3. Many functions take strings instead of integer constants, causing performance problems. SVGLength uses an integer constant for the unit and caches the value after conversion user units (the only thing actually used when rendering), which makes it a lot faster.
Regards, Krzysztof