标签: v8

node.js是传统脚本语言(如Perl和Python)的可行替代方案吗?

最近,我已经不再喜欢Perl作为跨平台的通用脚本语言了,而且Python和Ruby也没有真正吸引过我.

但是我已经越来越习惯于在浏览器中使用JavaScript,它在V8等现代引擎中的表现相当不错,而node.js现在已经真正起飞了几年.

但node.js主要用于服务器端网络编程.正如它在其主页上声明的那样:

基于V8的事件驱动的I/O服务器端JavaScript环境.

我想知道node.js目前是否也适合作为*nix和Windows上的通用脚本语言,作为Perl,Python和Ruby的替代品.

我没有太多关于以这种方式使用它的说法,但它确实似乎有一个广泛的社区,我没有注意到任何说它不适合这种用途.这种方式被广泛使用吗?或者它缺少这类事物的关键功能或模块?

javascript scripting cross-platform v8 node.js

28
推荐指数
1
解决办法
9781
查看次数

Javascript eval()例外 - 行号

在JavaScript中我有一个var str = ".a long string that contains many lines..." 由异常引起的eval(str);

我想抓住它并打印导致异常的行号.(str内部的行...)

可能吗?

编辑作为Alligator项目(http://github.com/mrohad/Alligator)的一部分,我是JavaScript的应用程序服务器,我正在从磁盘读取文件和eval()嵌套到scriplet的任何东西(<??> )

我使用NodeJS(在V8之上)在浏览器外部运行此脚本.

javascript v8 eval exception node.js

27
推荐指数
2
解决办法
1万
查看次数

为什么Node.JS中的V8比我的原生C++插件更快?

为什么我的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)

javascript c++ performance v8 node.js

27
推荐指数
1
解决办法
5402
查看次数

将v8的内存管理配置为node.js进程的智能

我们在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: …

garbage-collection memory-management v8 node.js

27
推荐指数
1
解决办法
4万
查看次数

使用Google V8从C++代码中抛出JavaScript异常

我正在编写一个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异常的正确方法是什么?

javascript c++ v8

26
推荐指数
2
解决办法
6808
查看次数

使用V8和PostgreSQL进行Javascript序列化和性能

我一直在试验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中.

javascript postgresql v8 plv8

26
推荐指数
3
解决办法
4485
查看次数

什么是内部字段数,SetInternalFieldCount用于什么?

我无法理解SetInternalFieldCount()函数的实际功能.在v8文档中,该函数被描述为设置"从此模板生成的对象的内部字段数".这是非常自我解释和无意义的.

v8嵌入器的指南中,他们给出了这个例子

point_templ->SetInternalFieldCount(1); 
Run Code Online (Sandbox Code Playgroud)

并说"这里内部字段计数设置为1,这意味着该对象有一个内部字段,索引为0,指向C++对象."

但究竟什么是内部领域以及设置此值实际上告诉程序的是什么?

c++ v8 embedded-v8

26
推荐指数
1
解决办法
5282
查看次数

setInterval和setTimeout如何工作?

我处在一个尴尬的境地,

我使用纯JavaScript已经有近3年了,我知道JavaScript是单线程语言,你可以使用setIntervalsetTimeout函数来模拟异步执行,

但当我想到他们如何工作时,我无法清楚地理解它.那么这些函数如何影响执行上下文?

我想在特定时间内只运行代码的一部分,然后切换到另一部分.如果是这样,那么很多setInterval或者setTimeout 电话会影响性能吗?

javascript browser v8 spidermonkey chakra

26
推荐指数
3
解决办法
2万
查看次数

Javascript:如何在RegEx .exec结果中获得多个匹配项

我跑的时候

/(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

javascript regex v8 node.js

25
推荐指数
4
解决办法
3万
查看次数

在V8中使用数组(性能问题)

我尝试了下一个代码(它在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)

javascript arrays firefox google-chrome v8

25
推荐指数
2
解决办法
6235
查看次数