gpt4 book ai didi

c++ - 与非常轻量级的 "DEFINE NATIVE ENTRY"函数相比,为什么 Dart 中的原生包装函数如此重量级?

转载 作者:行者123 更新时间:2023-12-01 13:58:59 25 4
gpt4 key购买 nike

我无法理解:“为什么要这样保证?”。

这是来自 dart/runtime/vm/native_entry.cc 的自定义 native 函数的包装器:

它适用于想要编写的 Dart 程序员 native extensions .

void NativeEntry::NativeCallWrapper(Dart_NativeArguments args,
Dart_NativeFunction func) {
CHECK_STACK_ALIGNMENT;
VERIFY_ON_TRANSITION;
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
Isolate* isolate = arguments->isolate();
ApiState* state = isolate->api_state();
ASSERT(state != NULL);
ApiLocalScope* current_top_scope = state->top_scope();
ApiLocalScope* scope = state->reusable_scope();
TRACE_NATIVE_CALL("0x%" Px "", reinterpret_cast<uintptr_t>(func));
if (scope == NULL) {
scope = new ApiLocalScope(current_top_scope,
isolate->top_exit_frame_info());
ASSERT(scope != NULL);
} else {
scope->Reinit(isolate,
current_top_scope,
isolate->top_exit_frame_info());
state->set_reusable_scope(NULL);
}
state->set_top_scope(scope); // New scope is now the top scope.

func(args);

ASSERT(current_top_scope == scope->previous());
state->set_top_scope(current_top_scope); // Reset top scope to previous.
if (state->reusable_scope() == NULL) {
scope->Reset(isolate); // Reset the old scope which we just exited.
state->set_reusable_scope(scope);
} else {
ASSERT(state->reusable_scope() != scope);
delete scope;
}
DEOPTIMIZE_ALOT;
VERIFY_ON_TRANSITION;
}

这个包装器在每次调用包装的 native 函数时都会执行所有不必要的检查,这使得这些函数与使用开发人员自己的函数相比没有竞争力。

这是用于定义来自 dart/runtime/vm/native_entry.h 的本地函数的宏:

#define DEFINE_NATIVE_ENTRY(name, argument_count)                              \
static RawObject* DN_Helper##name(Isolate* isolate, \
NativeArguments* arguments); \
void NATIVE_ENTRY_FUNCTION(name)(Dart_NativeArguments args) { \
CHECK_STACK_ALIGNMENT; \
VERIFY_ON_TRANSITION; \
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); \
ASSERT(arguments->NativeArgCount() == argument_count); \
TRACE_NATIVE_CALL("%s", ""#name); \
{ \
StackZone zone(arguments->isolate()); \
SET_NATIVE_RETVAL(arguments, \
DN_Helper##name(arguments->isolate(), arguments)); \
DEOPTIMIZE_ALOT; \
} \
VERIFY_ON_TRANSITION; \
} \
static RawObject* DN_Helper##name(Isolate* isolate, \
NativeArguments* arguments)

我知道它直接适用于 RawObject .这是正常的。

但是我找不到所有这些测试,这些测试在每次调用中执行,如上面的包装器。

当我看到我的函数的运行速度比通过 DEFINE_NATIVE_ENTRY 定义的类似物慢 3000% 时,我感到很沮丧。 .

附注

我的 native function确实如此 NOTHING并且不 returns ANYTHING比(例如)这个函数慢 500%。

#define TYPED_DATA_GETTER(getter, object, access_size)                         \
DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
if (instance.IsTypedData()) { \
const TypedData& array = TypedData::Cast(instance); \
RangeCheck(offsetInBytes.Value(), access_size, \
array.LengthInBytes(), access_size); \
return object::New(array.getter(offsetInBytes.Value())); \
} \
if (instance.IsExternalTypedData()) { \
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
RangeCheck(offsetInBytes.Value(), access_size, \
array.LengthInBytes(), access_size); \
return object::New(array.getter(offsetInBytes.Value())); \
} \
const String& error = String::Handle(String::NewFormatted( \
"Expected a TypedData object but found %s", instance.ToCString())); \
Exceptions::ThrowArgumentError(error); \
return object::null(); \
} \

有什么方法可以编写不需要所有这些的轻量级 native 函数 scope ?

最佳答案

这是一个老问题,但本地库绝对不是最好的,而且非常重要。这些天我们通常建议用户查看使用 dart:ffi对于 C-interop,它比原生扩展性能更高,而且可以说更容易使用。

关于c++ - 与非常轻量级的 "DEFINE NATIVE ENTRY"函数相比,为什么 Dart 中的原生包装函数如此重量级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com