V8中这些对象之间有什么区别/连接?上下文"属于"Isolate,反之亦然?
我知道单个Isolate一次只能被一个线程访问(这就是我猜的v8 :: Locker的用途?).
我查看了文档,但我似乎无法掌握这些概念 - 任何帮助都表示赞赏!
我正在使用c ++和v8,并遇到了以下挑战:我希望能够使用v8在javascript中定义一个函数,然后通过c ++调用该函数.另外,我希望能够从c ++将参数传递给javascript函数.我认为以下示例源代码最能解释它.检查示例代码的末尾,看看我想要完成什么.
#include <v8.h>
#include <iostream>
#include <string>
#include <array>
using namespace v8;
int main(int argc, char* argv[]) {
// Create a stack-allocated handle scope.
HandleScope handle_scope;
// Create a new context.
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Handle<String> source;
Handle<Script> script;
Handle<Value> result;
// Create a string containing the JavaScript source code.
source = String::New("function test_function(test_arg) { var match = 0;if(test_arg[0] == test_arg[1]) { match = 1; }");
// Compile the source code.
script = Script::Compile(source);
// …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在我的Java应用程序中嵌入Google JavaScript引擎V8的解决方案.
你有一些解决方案吗?
我无法理解SetInternalFieldCount()
函数的实际功能.在v8文档中,该函数被描述为设置"从此模板生成的对象的内部字段数".这是非常自我解释和无意义的.
在v8嵌入器的指南中,他们给出了这个例子
point_templ->SetInternalFieldCount(1);
Run Code Online (Sandbox Code Playgroud)
并说"这里内部字段计数设置为1,这意味着该对象有一个内部字段,索引为0,指向C++对象."
但究竟什么是内部领域以及设置此值实际上告诉程序的是什么?
我需要使用1-100的混合类型属性来序列化中等复杂的对象.
最初使用JSON,然后我切换到BSON,速度稍快.
编码10000个样本对象
JSON: 1807mS
BSON: 1687mS
MessagePack: 2644mS (JS, modified for BinaryF)
Run Code Online (Sandbox Code Playgroud)
我想要一个数量级的增加; 它对系统的其他部分产生了非常糟糕的影响.
转向BSON的部分动机是对二进制数据进行编码的要求,因此JSON(现在)不适合.而且因为它只是跳过对象中存在的二进制数据,所以它们在那些基准测试中"作弊".
描述了BSON性能热点
BSON编码器基于Mongo BSON库.
本机V8二进制序列化器可能很棒,但由于JSON是原生的并且可以快速序列化,我担心即使这可能无法提供答案.也许我最好的办法是优化BSON库中的数据,或者编写自己的数据,以便更有效地将字符串拉出V8.一种策略可能是为BSON添加UTF16支持.
所以我在这里提出想法,也许是一个健全检查.
编辑
添加了MessagePack基准测试.这是从原始JS修改为使用BinaryF.
C++ MessagePack库可以提供进一步的改进,我可以单独对其进行基准测试,以直接与BSON库进行比较.
在Delphi Chromium Embedded的帮助下,我已成功将Chromium嵌入到我的Delphi 6项目中.现在我希望能够执行Javascript代码并将结果返回给我的主机Delphi应用程序.我当前的方法是调用ExecuteJavascript()并使用Javascript调用将其结果写入的DOM元素,并从Delphi中的TTimer方法中轮询该元素以检索结果.但是,我读到使用本机函数和V8扩展将Javascript调用"回调"到我的Delphi代码中,作为接收结果的方式:
http://magpcss.org/ceforum/viewtopic.php?f=7&t=180
我想尝试这个,我也想知道如何将基于Delphi的事件监听器附加到网页中的DOM元素(onblur,onmousedown等).我正在寻找一些样本,如果有人知道在哪里找到它们会告诉我如何做这两件事.
以下是v8代码评论,我不太明白解释.
/**
* Marks the reference to this object independent. Garbage collector
* is free to ignore any object groups containing this object.
* Weak callback for an independent handle should not
* assume that it will be preceded by a global GC prologue callback
* or followed by a global GC epilogue callback.
*/
inline void MarkIndependent();
inline void MarkIndependent(Isolate* isolate);
Run Code Online (Sandbox Code Playgroud) 我在Ubuntu上安装phpv8js时遇到了一些麻烦.
我已经确定我安装了最新版本的libv8,并且拥有所需的PHP版本,但是使用PECL安装失败.
这是输出:
libtool: compile: g++ -I. -I/tmp/pear/temp/v8js -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootFyySRS/v8js-0.1.2/include -I/tmp/pear/temp/pear-build-rootFyySRS/v8js-0.1.2/main -I/tmp/pear/temp/v8js -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/v8js/v8js.cc -fPIC -DPIC -o .libs/v8js.o
/tmp/pear/temp/v8js/v8js.cc:100: warning: deprecated conversion from string constant to ‘char*’
/tmp/pear/temp/v8js/v8js.cc:100: warning: deprecated conversion from string constant to ‘char*’
/tmp/pear/temp/v8js/v8js.cc:100: warning: deprecated conversion from string constant to ‘char*’
/tmp/pear/temp/v8js/v8js.cc: In function ‘void zim_V8Js___construct(int, zval*, zval**, zval*, int)’:
/tmp/pear/temp/v8js/v8js.cc:569: warning: deprecated conversion from string constant to ‘char*’
/tmp/pear/temp/v8js/v8js.cc: In function ‘void zim_V8Js_executeString(int, zval*, zval**, zval*, …
Run Code Online (Sandbox Code Playgroud) 我在V8清理垃圾时遇到了麻烦.首先,我的Javascript如下:
var bigstring = "ASD";
for (var b = 0; b < 20; b++) {
bigstring = bigstring + bigstring;
}
trace("bigstring " + bigstring.length);
function frame() {
// generate some garbage
var junkArray = [];
for (var i = 0; i < 1000; i++) {
junkArray.push(i + bigstring);
}
}
Run Code Online (Sandbox Code Playgroud)
从C++开始,我正在运行一个循环:
frame
.while(!V8::IdleNotification()) {};
预期的结果是每次迭代junkArray
都会收集垃圾.毕竟,IdleNotification
只有当"V8完成尽可能多的清理"时才返回true (doc).
事实上,垃圾只清理*约.每100次迭代.我错过了一步吗?是junkArray
出于某种原因不是立即垃圾frame
?
*通过比较堆使用前后来确定
对于给定的JavaScript代码,是否可以访问v8引擎的AST?我正在使用V8引擎开发JavaScript静态分析器.
embedded-v8 ×10
v8 ×8
javascript ×5
c++ ×3
bson ×1
chromium ×1
delphi ×1
interpreter ×1
java ×1
php ×1