最近,我已经不再喜欢Perl作为跨平台的通用脚本语言了,而且Python和Ruby也没有真正吸引过我.
但是我已经越来越习惯于在浏览器中使用JavaScript,它在V8等现代引擎中的表现相当不错,而node.js现在已经真正起飞了几年.
但node.js主要用于服务器端网络编程.正如它在其主页上声明的那样:
基于V8的事件驱动的I/O服务器端JavaScript环境.
我想知道node.js目前是否也适合作为*nix和Windows上的通用脚本语言,作为Perl,Python和Ruby的替代品.
我没有太多关于以这种方式使用它的说法,但它确实似乎有一个广泛的社区,我没有注意到任何说它不适合这种用途.这种方式被广泛使用吗?或者它缺少这类事物的关键功能或模块?
在JavaScript中我有一个var str = ".a long string that contains many lines..."
由异常引起的eval(str);
我想抓住它并打印导致异常的行号.(str内部的行...)
可能吗?
编辑作为Alligator项目(http://github.com/mrohad/Alligator)的一部分,我是JavaScript的应用程序服务器,我正在从磁盘读取文件和eval()嵌套到scriplet的任何东西(<??> )
我使用NodeJS(在V8之上)在浏览器外部运行此脚本.
为什么我的C++插件中的Google V8 JavaScript引擎的工作速度明显慢于Node.JS?
我试着编写一些简单的代码来生成JavaScript中的素数,并通过我的C++插件在V8中运行,直接在Node.JS中运行.
我非常震惊,因为两者都应该使用相同的JavaScript引擎,并且两者都执行相同的代码(时间以毫秒为单位,越少越好):
V8 in Node.JS: 495517
V8 in Node.JS C++ Addon: 623598
Run Code Online (Sandbox Code Playgroud)
这是JavaScript模块的源代码和运行相同JavaScript代码的C++插件的源代码(我认为问题不在interop中,因为测量时间直接在JS中工作):
index.js:
var jsInNodeJsPrimeGeneratorBenchmark = require("./javascript.js");
var jsInNativePrimeGeneratorBenchmark = require("./native");
console.log("V8 in Node.JS: ", jsInNodeJsPrimeGeneratorBenchmark.primeGeneratorBenchmark());
console.log("V8 in Node.JS C++ Addon: ", jsInNativePrimeGeneratorBenchmark.primeGeneratorBenchmark());
Run Code Online (Sandbox Code Playgroud)
javascript.js:
function primeGeneratorBenchmark() {
var result, primeNumberCounter, i, j, isPrime, start, end;
i = 3;
primeNumberCounter = 1;
start = Date.now();
while (primeNumberCounter < 100000) {
isPrime = true;
for (j = 2; j < i; j++) {
if (i % …Run Code Online (Sandbox Code Playgroud) 我们在node.js上运行一个XMPP服务器,在一台大约3.8 GB RAM的机器上运行.以下是我们在调用节点时传递的命令行参数:/ opt/node/bin/node --max-old-space-size = 3000 --trace-gc --trace-gc-verbose main.js
但是,我们经常需要在此过程中看到超过10秒的gc暂停(有时多达1分钟gc暂停,我们的服务器除了运行GC之外什么都不做).当发生这种情况时,我们的进程是正常的内存消耗:大约1 GB的堆使用量.该过程有大约2 GB或可用空间,但该过程不使用它并花费一分钟尝试释放内存.
查看--trace-gc-verbose选项给出的gc跟踪,看起来大约2 GB的可用空间被标记为"大对象空间",并且没有使用,因为没有那么多大对象.虽然该过程迫切需要更多内存用于"旧指针"和"旧数据空间",但不使用来自"大对象空间"的这个空闲内存.
这是gc在其中一个时间内留下的痕迹,其中有一个长gc暂停:
91635809 ms: Mark-sweep 968.8 (1039.0) -> 958.5 (1038.0) MB, 1 / 410 ms (+ 2287 ms in 79 steps since start of marking, biggest step 140.227051 ms) [idle notification: finalize incremental] [GC in old space requested]. Memory allocator, used: 1088446464, available: 2124390400 New space, used: 192, available: 8388416 Old pointers, used: 633992112, available: 10460240, waste: 0 Old data space, used: 315819248, available: 149776, waste: …
我正在编写一个JavaScript应用程序,它通过Google的V8访问一些C++代码.
一切正常,但我无法弄清楚如何抛出JavaScript异常,这可以从C++方法的JavaScript代码中获取.
例如,如果我有像C++这样的函数
...
using namespace std;
using namespace v8;
...
static Handle<Value> jsHello(const Arguments& args) {
String::Utf8Value input(args[0]);
if (input == "Hello") {
string result = "world";
return String::New(result.c_str());
} else {
// throw exception
}
}
...
global->Set(String::New("hello"), FunctionTemplate::New(jsHello));
Persistent<Context> context = Context::New(NULL, global);
...
Run Code Online (Sandbox Code Playgroud)
暴露在JavaScript中,我想在JavaScript代码中使用它
try {
hello("throw me some exception!");
} catch (e) {
// catched it!
}
Run Code Online (Sandbox Code Playgroud)
从C++代码中抛出V8异常的正确方法是什么?
我一直在试验PostgreSQL和PL/V8,它将V8 JavaScript引擎嵌入到PostgreSQL中.使用这个,我可以查询数据库中的JSON数据,这非常棒.
基本方法如下:
CREATE or REPLACE FUNCTION
json_string(data json, key text) RETURNS TEXT AS $$
var data = JSON.parse(data);
return data[key];
$$ LANGUAGE plv8 IMMUTABLE STRICT;
SELECT id, data FROM things WHERE json_string(data,'name') LIKE 'Z%';
Run Code Online (Sandbox Code Playgroud)
使用,V8我可以将JSON数据解析为JS,然后返回一个字段,我可以将其用作常规的pg查询表达式.
但
在大型数据集上,性能可能是一个问题,因为我需要解析数据的每一行.解析器速度很快,但它肯定是过程中最慢的部分,每次都必须发生.
我试图制定出(到最后得到一个实际的问题)是,如果有一种方法可以缓存或预处理的JSON ......即使存储JSON表中的二进制表示,可以由V8使用自动作为JS对象可能是一个胜利.我已经看过使用替代格式,例如messagepack或protobuf,但我不认为它们在任何情况下都必须与原生JSON解析器一样快.
思想
PG有blob和二进制类型,因此数据可以以二进制形式存储,然后我们只需要一种方法将其编组到V8中.
我无法理解SetInternalFieldCount()函数的实际功能.在v8文档中,该函数被描述为设置"从此模板生成的对象的内部字段数".这是非常自我解释和无意义的.
在v8嵌入器的指南中,他们给出了这个例子
point_templ->SetInternalFieldCount(1);
Run Code Online (Sandbox Code Playgroud)
并说"这里内部字段计数设置为1,这意味着该对象有一个内部字段,索引为0,指向C++对象."
但究竟什么是内部领域以及设置此值实际上告诉程序的是什么?
我处在一个尴尬的境地,
我使用纯JavaScript已经有近3年了,我知道JavaScript是单线程语言,你可以使用setInterval和setTimeout函数来模拟异步执行,
但当我想到他们如何工作时,我无法清楚地理解它.那么这些函数如何影响执行上下文?
我想在特定时间内只运行代码的一部分,然后切换到另一部分.如果是这样,那么很多setInterval或者setTimeout
电话会影响性能吗?
我跑的时候
/(a)/g.exec('a a a ').length
Run Code Online (Sandbox Code Playgroud)
我明白了
2
Run Code Online (Sandbox Code Playgroud)
但我认为它应该回归
3
Run Code Online (Sandbox Code Playgroud)
因为a字符串中有3个,而不是2个!
这是为什么?
我希望能够在RegEx中搜索字符串的所有出现并迭代它们.
FWIW:我正在使用node.js
我尝试了下一个代码(它在Google Chrome和nodejs中显示了类似的结果):
var t = new Array(200000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27839.499ms
undefined
Run Code Online (Sandbox Code Playgroud)
我也跑了下一个测试:
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 449.948ms
undefined
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(undefined);} console.timeEnd('wtf');
wtf: 406.710ms
undefined
Run Code Online (Sandbox Code Playgroud)
但在Firefox中,第一个变体看起来都很好:
>>> var t = new Array(200000); console.time('wtf'); ...{t.push(Math.random());} console.timeEnd('wtf');
wtf: 602ms
Run Code Online (Sandbox Code Playgroud)
V8会发生什么?
UPD *神奇地降低了性能*
var t …Run Code Online (Sandbox Code Playgroud) v8 ×10
javascript ×8
node.js ×5
c++ ×3
arrays ×1
browser ×1
chakra ×1
embedded-v8 ×1
eval ×1
exception ×1
firefox ×1
performance ×1
plv8 ×1
postgresql ×1
regex ×1
scripting ×1
spidermonkey ×1