2016-08-19 22:02:33 +02:00
|
|
|
These benchamrks are informal and only intended to give us a general sense of
|
|
|
|
the benefit Dart Sass could provide relative to other implementations.
|
2016-07-16 00:26:10 +02:00
|
|
|
|
2016-08-19 22:02:33 +02:00
|
|
|
This was tested against:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* libsass eee6d59 and sassc 2fcd639 compiled with g++ 4.8.4.
|
|
|
|
* Dart Sass dfecdcd on Dart 1.19.1.
|
|
|
|
* Ruby Sass e79f5cf on Ruby 2.2.4p230
|
|
|
|
|
|
|
|
on Ubuntu x64 with Intel Xeon E5-1650 v3 @ 3.50GHz.
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
# Measurements
|
|
|
|
|
|
|
|
I ran five instances of each configuration and recorded the fastest time.
|
|
|
|
|
|
|
|
## Small Plain CSS
|
|
|
|
|
|
|
|
Running on a file containing 4 instances of `.foo {a: b}`:
|
|
|
|
|
|
|
|
* sassc: 0.003s
|
2016-10-01 01:26:02 +02:00
|
|
|
* Dart Sass from source: 0.255s
|
|
|
|
* Dart Sass from a snapshot: 0.193s
|
|
|
|
* Ruby Sass with a hot cache: 0.130s
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
## Large Plain CSS
|
|
|
|
|
|
|
|
Running on a file containing 2^17 instances of `.foo {a: b}`:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* sassc: 1.972s
|
|
|
|
* Dart Sass from source: 2.597s
|
|
|
|
* Dart Sass from a snapshot: 2.547s
|
|
|
|
* Ruby Sass with a hot cache: 14.484s
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
Based on these numbers, Dart Sass is approximately:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* 1.3x slower than libsass
|
|
|
|
* 5.7x faster than Ruby Sass
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
## Preceding Sparse `@extend`
|
|
|
|
|
|
|
|
Running on a file containing `.x {@extend .y}`, 2^17 instances of `.foo {a: b}`,
|
|
|
|
and then `.y {a: b}`:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* sassc: 2.202s
|
|
|
|
* Dart Sass from a snapshot: 2.598s
|
|
|
|
* Ruby Sass with a hot cache: 22.423s
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
Based on these numbers, Dart Sass is approximately:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* 1.2x slower than libsass
|
|
|
|
* 8.6x faster than Ruby Sass
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
## Following Sparse `@extend`
|
|
|
|
|
|
|
|
Running on a file containing `.y {a: b}`, 2^17 instances of `.foo {a: b}`,
|
|
|
|
and then `.x {@extend .y}`:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* sassc: 2.207s
|
|
|
|
* Dart Sass from a snapshot: 2.569s
|
|
|
|
* Ruby Sass with a hot cache: 22.221s
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
Based on these numbers, Dart Sass is approximately:
|
|
|
|
|
|
|
|
* 1.2x slower than libsass
|
2016-10-01 01:26:02 +02:00
|
|
|
* 8.7x faster than Ruby Sass
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
## Preceding Dense `@extend`
|
|
|
|
|
|
|
|
Running on a file containing `.bar {@extend .foo}` followed by 2^17 instances of
|
|
|
|
`.foo {a: b}`:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* sassc: 6.703s
|
|
|
|
* Dart Sass from a snapshot: 3.922s
|
|
|
|
* Ruby Sass with a hot cache: 40.193s
|
2016-07-16 00:26:10 +02:00
|
|
|
|
|
|
|
Based on these numbers, Dart Sass is approximately:
|
|
|
|
|
2016-08-19 22:02:33 +02:00
|
|
|
* 1.7x faster than libsass
|
|
|
|
* 10.3x faster than Ruby Sass
|
|
|
|
|
|
|
|
## Following Dense `@extend`
|
|
|
|
|
|
|
|
Running on a file containing 2^17 instances of `.foo {a: b}` followed by
|
|
|
|
`.bar {@extend .foo}`:
|
|
|
|
|
2016-10-01 01:26:02 +02:00
|
|
|
* sassc: 6.636s
|
|
|
|
* Dart Sass from a snapshot: 3.644s
|
|
|
|
* Ruby Sass with a hot cache: 39.603s
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
Based on these numbers, Dart Sass is approximately:
|
|
|
|
|
|
|
|
* 1.8x faster than libsass
|
2016-10-01 01:26:02 +02:00
|
|
|
* 10.9x faster than Ruby Sass
|
2016-08-19 22:02:33 +02:00
|
|
|
|
|
|
|
# Conclusions
|
|
|
|
|
|
|
|
Based on this (admittedly imperfect and non-representative) data, Dart Sass is
|
|
|
|
well within the desired performance bounds for large codebases. Because it
|
|
|
|
eagerly tracks data for `@extend`s, its worst case is when no `@extend`s are
|
|
|
|
present and that tracking proves unnecessary. However, even there it's only 2.2x
|
|
|
|
slower than libsass, and well within a reasonable amount of time to process over
|
|
|
|
130,000 selectors.
|
|
|
|
|
|
|
|
Because of the novel structuring of `@extend`, we see its relative performance
|
|
|
|
increase along with the amount of extension. With only one `@extend` it's almost
|
|
|
|
on par with libsass; with hundreds of thousands, it's actually faster.
|
|
|
|
|
|
|
|
It's worth noting that Dart Sass implements `@extend` semantics according to
|
|
|
|
[issue 1599][], while other implementations do not. This certainly simplifies
|
|
|
|
the implementation and may explain some of the speed gains. However, even if
|
|
|
|
other implementations could be faster, it's still the case that Dart Sass is
|
|
|
|
*fast enough*.
|
|
|
|
|
|
|
|
[1599]: https://github.com/sass/sass/issues/1599
|