Node四种动态加载JS代码方法性能对比

背景

我们运行node程序的时候,一般情况下,js代码都是事先写好在js文件里,然后启动的时候加载到内存中执行的。在一些特殊的需求下,我们可能会执行一些动态的js代码。

四种方法

目前我能想到的方法有四种:

  • eval函数直接执行
  • new Function创建函数
  • 写入文件再require引入
  • 使用 V8 虚拟机

1. eval函数直接执行

eval函数大家都比较熟悉,它能动态的执行一段js代码文本,大多数人一开始肯定想到是使用eval函数来执行,用起来也十分的方便,例如:

var jscode = 'console.log("你好~")';
eval(jscode) // 你好~

执行上面这段代码,会输出“你好~”。

2. new Function创建函数

与其他语言相比,函数在js里面的存在方式比较特殊,在js里,函数是一等公民,一个函数可以作为另一个函数的参数或者是返回值,同时函数本身是一个对象,只不过这个对象可以通过在其后面加“()”来调用它。创建函数的方式也有多种:

// 函数声明
function foo() {
   console.log('你好~')}
foo(); // 你好~

// 函数表达式
var foo = function() {
   console.log('你好~')};
foo(); // 你好~

// new Function创建对象
var jscode = 'console.log("你好~")';
var foo = new Function('a',jscode);
foo('你好~'); // 你好~

通过new Function的方式创建的一个函数,它的参数是这样的:new Function(参数1,参数2,…,参数n,函数体),函数体是字符串,所以通过new Function,也可以执行动态的js代码。

3. 写入文件再require引入

以上两个方法无论在浏览器还是在node端,都能能生效。如果在node,我们还有其他的选择,我们可以把代码写入到一个文件里,然后再通过模块化规范,引入刚刚写入的js文件:

var fs = require('fs');

var fileName = __dirname + '/foo.js';
var jscode = 'console.log("你好~")';
var data = 'function foo(){' + jscode + '} module.exports = foo;';
// 写入文件
fs.writeFileSync(fileName, data);
var foo = require(fileName);
// 删除文件
fs.unlinkSync(fileName);

foo(); // 你好~

4. 使用 V8 虚拟机

node的 vm 模块提供了一系列 API 用于在 V8 虚拟机环境中编译和运行代码,js代码可以被编译并立即运行,或编译、保存然后再运行。运行代码的时候,我们可以指定代码运行在新的上下文,也可以指定在当前的上下文,在不同的上下文中得到的全局变量是不一样的。但是无论是在新的上下文中执行代码,还是在当前上下文中执行代码,都无法访问当前的作用域,也就是说,代码会在新的作用域中运行。
使用vm模块来在V8中创建需要执行的代码:

var vm = require('vm');
var jscode = 'console.log("你好~")';
var script = new vm.Script(jscode);
// 在当前上下文中运行
script.runInThisContext(); // 你好~


性能对比

上面说的四种方法都能执行动态的js代码,那么他们的性能如何呢?与正常执行比较会如何,下面我们来测试一下。注意,我们说的性能指的是动态代码的执行性能,而不是动态代码载入内存的性能。

下面是一段快速排序的算法,我们用这段代码来给一个2000个值的数组循环排序10000次:

// 快速排序
function quickSort(arr, left, right) {
   
    var len = arr.length;
    var partitionIndex;
    left = typeof left != 'number' ? 0 : left;
    right = typeof right != 'number' ? len - 1 : right;

    if (left < right) {
   
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex - 1);
        quickSort(arr, partitionIndex + 1, right);
    }
    return arr;
}

function partition(arr, left, right) {
   
    var pivot = left;
    var index = pivot + 1;
    for (var i = index; i <= right; i++) {
   
        if (arr[i] < arr[pivot]) {
   
            swap(arr, i, index);
            index++;
        }
    }
    swap(arr, pivot, index - 1);
    return index - 1;
}

function swap(arr, i, j) {
   
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
// 快速排序 - 结束

// 测试代码
var ary = [521,836,1818,1652,1687,1320,89,1491,101,220,162,1216,1715,1908,247,143,397,1551,936,1585,1716,1036,272,1049,540,619,698,1234,421,1341,1911,1677,112,1898,1374,417,213,1855,1357,886,92,564,1390,1801,991,985,349,1900,513,33,876,1495,748,123,880,1229,295,1570,625,942,1732,1099,208,1181,287,1658,401,1812,621,796,682,51,1051,473,1911,1742,1813,1664,1371,1701,894,637,1361,233,913,1604,1355,1468,1226,1213,1525,758,1879,80,1774,1146,1382,869,381,1219,883,795,1904,806,1058,1127,1642,1743,1905,965,547,915,874,1399,1348,1136,1923,1892,969,1808,15,831,1249,1935,1516,581,1925,1090,1043,1238,784,1210,285,565,217,933,1699,224,1669,1899,557,177,381,1526,1111,498,92,552,1211,1791,1053,995,1722,406,477,1903,365,1591,541,1879,838,1143,871,68,1871,1363,1920,219,1184,865,566,18,1859,469,714,110,1916,1591,1290,728,1874,778,1708,1045,1962,590,585,1120,1128,295,1371,279,293,1480,1033,639,1339,619,1845,1481,1117,519,1835,421,1805,1130,1805,682,1676,985,857,1078,1331,1040,1102,261,848,1380,1016,1034,1563,1871,685,853,1461,760,766,540,779,389,102,308,1570,1647,1076,1952,1211,1495,855,1970,1160,1277,1186,1573,837,1762,966,1844,140,398,957,1298,1405,1286,997,47,188,33,1025,668,799,1803,640,457,1994,859,1550,521,1372,324,1369,1243,95,1149,1492,646,1235,1779,1798,91,1778,1356,1283,207,339,1359,1801,1083,1945,1263,1657,513,1076,1809,1603,524,658,515,97,708,198,1457,193,1166,689,437,584,336,670,599,1547,131,1374,636,855,441,635,444,262,724,639,641,444,1931,690,874,1431,278,85,53,284,1216,1353,709,108,1313,383,1395,1240,323,1674,82,139,1752,1367,1821,947,1805,1878,1375,1318,1425,1724,327,1712,1294,482,1792,767,1774,835,1874,627,576,1875,297,387,1757,123,994,661,215,159,1800,743,1169,807,547,211,947,1978,1495,1822,663,25,401,258,658,1601,376,1005,127,1526,1199,840,538,1811,1289,1989,1473,227,1948,94,1769,236,762,741,643,625,1086,257,167,310,1785,610,927,134,38,1994,1235,211,550,1480,761,440,1346,1849,926,594,1286,1260,689,918,1013,1669,447,267,1170,875,374,1734,1191,714,1987,1977,1312,1393,1137,1814,1574,1342,666,1352,1187,26,582,1510,1728,484,1393,173,930,1073,718,351,8,1991,1178,1353,400,1424,1065,131,171,208,266,1992,1844,1928,1636,1245,342,1661,1068,443,733,572,126,631,406,132,1546,936,1412,373,1912,696,880,982,1235,1732,2,599,1018,578,37,431,460,1119,579,861,1004,1405,1615,1523,1674,1810,1407,911,1403,1562,1370,1758,704,537,934,366,1127,201,1930,1729,1036,1280,1379,230,360,1740,1313,203,77,1641,75,1364,962,466,1829,1989,631,388,39,1304,1972,1033,1134,1176,1842,525,1064,364,91,317,917,966,1996,703,1922,1111,724,1874,895,1998,1524,1655,24,373,405,695,660,859,1174,358,1510,544,1235,869,477,1219,1954,1206,904,991,1070,917,1572,237,262,958,516,190,1053,1778,901,1517,1317,1909,1595,167,1536,1511,1118,1814,1635,287,1138,1344,579,767,547,1064,671,1113,1316,1952,977,32,1060,1704,77,1066,1468,79,133,185,381,1816,1539,939,1675,187,1277,1414,1359,26,1878,205,999,930,1769,276,409,954,1585,24,1007,15,1662,1678,1123,606,985,966,779,1491,1204,377,1669,442,1939,564,351,591,391,1664,151,333,1150,773,1021,356,1204,350,1971,587,629,1547,907,1450,1472,74,1345,484,1930,452,1750,706,737,1175,85,1173,1563,1697,327,1992,406,1496,65,1387,1608,1933,1078,580,1632,1795,295,824,1413,176,889,488,141,1922,302,163,1700,1520,1877,1463,1471,979,758,666,1313,659,1633,1644,22,1087,1652,551,1472,1109,1149,86,357,671,37,648,1389,1907,1504,1691,544,759,567,1080,34,153,725,1233,1505,1385,219,65,1920,911,922,997,1311,1336,275,108,17,864,617,375,17,459,1231,1018,1695,298,1140,479,1088,75,197,1854,809,1955,217,434,248,1077,88,268,616,590,1983,1907,1265,251,527,1935,703,751,852,896,824,1838,240,746,964,729,1862,1111,1980,1178,111,1800,1764,1506,723,1179,622,1528,1457,1457,1581,532,1397,1672,752,1834,1624,1280,1752,1801,1245,253,888,374,1602,1020,781,672,1226,1960,1205,496,1543,263,1290,673,5,1822,218,778,914,1941,1686,1055,745,1831,927,518,1642,1672,1412,1849,1085,1390,483,1155,1939,540,1423,1893,740,685,1385,1895,1708,1492,461,1929,1476,153,810,422,892,808,3,1959,1235,1857,223,210,188,1210,560,540,169,1304,185,1116,713,1051,670,936,428,1593,127,231,201,696,960,271,1208,1792,1032,201,356,105,1738,1214,518,1909,370,1818,339,637,989,355,798,1324,759,1040,232,372,1961,815,898,1445,1418,1338,559,1089,21,35,1105,4,1468,1178,657,1830,315,1787,1076,1372,1011,864,1187,1595,461,1992,151,870,1943,1942,1782,669,1290,109,163,314,470,1635,1838,1794,1227,75,91,967,1712,1956,377,977,594,1511,1662,1115,930,1883,760,1648,1971,551,837,246,717,1936,729,1098,108,1627,1683,460,484,138,997,1880,585,358,1021,1737,748,128,11,1130,1082,1752,331,740,1029,120,213,586,1447,1932,1548,1376,1017,1919,1632,1054,1172,1215,269,1951,1791,1339,302,1551,1747,1674,930,534,1122,1904,213,1858,191,1920,1908,986,1594,1787,1207,1964,1415,1849,1807,599,1707,1678,1743,143,1686,175,288,1290,305,309,709,1416,1274,1924,548,366,48,1725,1806,237,1396,206,937,1767,1347,1008,1637,909,1401,1691,1809,22,1971,1530,1588,194,16,1303,1088,1776,726,1035,1456,1601,1739,953,784,383,1729,1780,1739,425,1967,103,1172,819,690,1991,99,623,942,1294,1530,663,260,1110,164,613,889,825,391,1310,657,1920,774,1178,1747,1662,235,1910,204,1898,143,519,734,1887,795,510,1730,578,1353,1579,1568,1030,1390,866,611,1169,30,1680,887,1870,450,63,1399,807,266,1828,1209,1586,330,570,1586,83,688,186,1651,906,417,1397,1169,409,253,64,1926,439,1192,651,1162,638,785,158,1695,1297,631,1541,353,1943,1843,27,1201,1522,446,1413,797,1522,1094,101,557,1691,286,209,1534,1173,1535,1909,404,47,1293,700,1664,139,1824,1418,33,1213,933,402,1300,396,1061,1371,1888,1266,802,1233,374,419,166,631,307,914,1880,1141,192,1674,1934,961,969,1327,1676,1218,406,285,638,1865,524,727,956,527,1524,1523,102,489,1102,1934,316,1923,1966,1965,812,1026,1520,1370,1267,1515,86,333,107,749,974,1241,1249,324,1635,1335,1733,1439,1148,22,1315,1920,1543,829,1642,283,1690,1981,764,1430,1827,454,684,1143,1849,200,1144,138,884,695,1386,346,1863,1593,92,1025,778,1131,1559,1772,1674,774,1384,1608,979,705,329,495,1821,890,1207,322,508,774,1030,1259,1168,413,276,1767,988,332,1122,958,1855,1651,282,858,396,207,350,329,799,24,1614,782,1267,580,1366,1608,637,1203,1607,642,980,1246,657,1604,1789,462,927,1316,126,1176,1437,1039,1559,1800,726,238,1670,465,1717,1093,1886,1099,879,721,1962,534,306,605,1028,1795,185,1611,234,1826,1299,362,764,1497,1018,1208,858,1884,1254,341,604,1808,769,1576,718,976,768,177,442,376,1733,1346,128,1625,1539,133,1219,1041,990,1060,801,129,1042,421,1077,1264,721,1135,1411,1303,1212,1804,196,1792,600,1789,705,1143,1586,1373,1306,850,1985,425,1908,1042,1877,1135,322,1035,1911,1635,1409,890,1113,1716,103,318,128,1834,208,1140,1350,1819,856,1411,1186,1722,1900,848,1550,1360,1447,318,351,1673,492,419,594,190,1573,1765,1097,288,443,1012,1321,695,781,447,728,1840,1179,623,283,563,1547,829,1803,628,728,1730,795,1301,1579,1686,1454,1020,1750,875,109,1896,1243,1969,2000,764,786,613,215,76,916,1549,71,1416,637,1028,137,68,355,635,98,1191,1590,1986,1932,139,1509,1431,1110,562,1523,122,1930,663,1400,1515,326,473,1479,1703,1475,1272,330,1010,1431,425,1748,1981,1512,335,105,1360,142,323,174,367,377,1720,111,1568,421,1816,548,1156,1365,368,63,1102,1214,1440,1278,1907,328,620,1550,949,1187,207,1253,662,1341,576,1169,1372,1273,519,1524,538,1543,437,459,1499,1671,1886,1657,923,524,610,535,880,960,723,100,1666,1997,420,1209,1142,64,1473,746,631,1729,881,312,1638,1701,1865,1700,1632,1645,1361,283,1501,1631,317,1541,727,1721,1760,293,387,1835,1648,1979,1897,1298,740,1276,1612,1047,99,1591,1498,1434,104,1874,582,1503,1305,1909,281,943,1318,1224,1272,1138,1020,1502,1830,1615,1187,715,217,209,1997,902,307,457,1717,1951,1223,463,1232,53,590,1830,408,962,1201,1867,1034,1290,1849,988,336,1653,947,460,751,376,1351,1041,1415,1133,744,345,1348,57,979,137,1063,617,972,621,1443,877,1520,1454,827,664,1719,593,1567,1821,1492,897,1199,1155,398,660,849,1864,1956,1377,1178,927,1657,1411,69,1136,988,948,1065,375,1129,148,1045,283,1060,1310,1255,159,1899,1343,883,1124,546,974,1350,1888,1653,237,447,1321,504,1860,244,1480,630,436,499,440,1853,1703,441,1517,896,561,129,1613,1835,301,1300,1903,257,764,1762,607,68,1637,529,971,473,201,1864,261,1337,525,1295,183,1750,1402,490,53,1267,1172,34,832,1959,1150,390,124,1840,1457,1084,1372,1441,1794,1756,270,1651,574,438,683,1908,251,630,1934,1931,893,1904,1505,1378,1341,1886,1104,397,1926,621,766,923,359,625,1208,277,56,1983,1103,1390,919,455,1349,1608,690,1652,275,1088,1040,844,1730,911,1092,724,1308,525,1840,1549,982,969,1102,1488,1057,1229,1587,1139,427,948,1425,1667,1014,1579,205,598,890,1372,657,1729,890,1736,1916,78,842,46,660,1385,1021,1184,816,746,1189
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值