2018-12-21 10:54:36 +03:00
|
|
|
#![feature(box_syntax)]
|
|
|
|
#![feature(test)]
|
|
|
|
|
2019-12-14 12:51:08 +03:00
|
|
|
extern crate test;
|
|
|
|
|
2020-03-02 14:49:08 +03:00
|
|
|
use std::hint::black_box;
|
2018-12-21 10:54:36 +03:00
|
|
|
use swc_common::FileName;
|
2019-12-02 11:10:06 +03:00
|
|
|
use swc_ecma_codegen::{self, Emitter};
|
2018-12-30 05:57:27 +03:00
|
|
|
use swc_ecma_parser::{Parser, Session, SourceFileInput, Syntax};
|
2018-12-21 10:54:36 +03:00
|
|
|
use test::Bencher;
|
|
|
|
|
2020-03-01 14:05:03 +03:00
|
|
|
const COLORS_JS: &str = r#"
|
2018-12-21 10:54:36 +03:00
|
|
|
'use strict';
|
|
|
|
/**
|
|
|
|
* Extract red color out of a color integer:
|
|
|
|
*
|
|
|
|
* 0x00DEAD -> 0x00
|
|
|
|
*
|
|
|
|
* @param {Number} color
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
function red( color )
|
|
|
|
{
|
|
|
|
let foo = 3.14;
|
|
|
|
return color >> 16;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Extract green out of a color integer:
|
|
|
|
*
|
|
|
|
* 0x00DEAD -> 0xDE
|
|
|
|
*
|
|
|
|
* @param {Number} color
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
function green( color )
|
|
|
|
{
|
|
|
|
return ( color >> 8 ) & 0xFF;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Extract blue color out of a color integer:
|
|
|
|
*
|
|
|
|
* 0x00DEAD -> 0xAD
|
|
|
|
*
|
|
|
|
* @param {Number} color
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
function blue( color )
|
|
|
|
{
|
|
|
|
return color & 0xFF;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Converts an integer containing a color such as 0x00DEAD to a hex
|
|
|
|
* string, such as '#00DEAD';
|
|
|
|
*
|
|
|
|
* @param {Number} int
|
|
|
|
* @return {String}
|
|
|
|
*/
|
|
|
|
function intToHex( int )
|
|
|
|
{
|
|
|
|
const mask = '#000000';
|
|
|
|
const hex = int.toString( 16 );
|
|
|
|
return mask.substring( 0, 7 - hex.length ) + hex;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Converts a hex string containing a color such as '#00DEAD' to
|
|
|
|
* an integer, such as 0x00DEAD;
|
|
|
|
*
|
|
|
|
* @param {Number} num
|
|
|
|
* @return {String}
|
|
|
|
*/
|
|
|
|
function hexToInt( hex )
|
|
|
|
{
|
|
|
|
return parseInt( hex.substring( 1 ), 16 );
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
red,
|
|
|
|
green,
|
|
|
|
blue,
|
|
|
|
intToHex,
|
|
|
|
hexToInt,
|
|
|
|
};
|
|
|
|
"#;
|
|
|
|
|
2020-03-01 14:05:03 +03:00
|
|
|
const LARGE_PARTIAL_JS: &str = include_str!("large-partial.js");
|
|
|
|
|
|
|
|
fn bench_emitter(b: &mut Bencher, s: &str) {
|
|
|
|
b.bytes = s.len() as _;
|
2018-12-21 10:54:36 +03:00
|
|
|
|
2019-01-07 13:43:47 +03:00
|
|
|
let _ = ::testing::run_test(true, |cm, handler| {
|
|
|
|
let session = Session { handler: &handler };
|
2020-03-02 14:49:08 +03:00
|
|
|
|
2020-03-01 14:05:03 +03:00
|
|
|
let fm = cm.new_source_file(FileName::Anon, s.into());
|
2019-02-08 07:00:58 +03:00
|
|
|
let mut parser = Parser::new(
|
|
|
|
session,
|
|
|
|
Syntax::default(),
|
|
|
|
SourceFileInput::from(&*fm),
|
|
|
|
None,
|
|
|
|
);
|
2020-03-02 14:49:08 +03:00
|
|
|
let mut src_map_buf = vec![];
|
2019-01-07 13:43:47 +03:00
|
|
|
let module = parser
|
|
|
|
.parse_module()
|
2019-01-17 17:17:16 +03:00
|
|
|
.map_err(|mut e| {
|
2019-01-07 13:43:47 +03:00
|
|
|
e.emit();
|
|
|
|
})
|
|
|
|
.unwrap();
|
2018-12-21 10:54:36 +03:00
|
|
|
|
|
|
|
b.iter(|| {
|
2020-03-02 14:49:08 +03:00
|
|
|
let mut buf = vec![];
|
2018-12-21 10:54:36 +03:00
|
|
|
{
|
|
|
|
let handlers = box MyHandlers;
|
|
|
|
let mut emitter = Emitter {
|
|
|
|
cfg: swc_ecma_codegen::Config {
|
|
|
|
..Default::default()
|
|
|
|
},
|
2019-02-26 07:56:58 +03:00
|
|
|
comments: None,
|
2018-12-21 10:54:36 +03:00
|
|
|
cm: cm.clone(),
|
|
|
|
wr: box swc_ecma_codegen::text_writer::JsWriter::new(
|
|
|
|
cm.clone(),
|
|
|
|
"\n",
|
2020-03-02 14:49:08 +03:00
|
|
|
&mut buf,
|
|
|
|
Some(&mut src_map_buf),
|
2018-12-21 10:54:36 +03:00
|
|
|
),
|
|
|
|
handlers,
|
|
|
|
};
|
|
|
|
|
2020-03-02 14:49:08 +03:00
|
|
|
let _ = emitter.emit_module(&module);
|
2018-12-21 10:54:36 +03:00
|
|
|
}
|
2020-03-02 14:49:08 +03:00
|
|
|
black_box(buf);
|
|
|
|
let srcmap = cm.build_source_map(&mut src_map_buf);
|
|
|
|
black_box(srcmap);
|
2018-12-21 10:54:36 +03:00
|
|
|
});
|
|
|
|
Ok(())
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-03-01 14:05:03 +03:00
|
|
|
#[bench]
|
|
|
|
fn emit_colors(b: &mut Bencher) {
|
|
|
|
bench_emitter(b, COLORS_JS)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn emit_large(b: &mut Bencher) {
|
|
|
|
bench_emitter(b, LARGE_PARTIAL_JS)
|
|
|
|
}
|
|
|
|
|
2018-12-21 10:54:36 +03:00
|
|
|
struct MyHandlers;
|
|
|
|
|
|
|
|
impl swc_ecma_codegen::Handlers for MyHandlers {}
|