当目标位于另一个 AppDomain 中时,非托管到托管的回调要慢得多

2024-03-28

我使用委托从非托管代码调用托管代码。当我调用默认 AppDomain 中的托管代码时,我测量到每次调用的平均时间为 5.4 纳秒。当我调用第二个 AppDomain 时,我测量到每次调用需要 194 纳秒。 (默认VS2017 x86发布配置,不在调试器下运行)。

为什么调用非默认 AppDomain 时性能会低得多?由于我来自非托管端,它不了解 AppDomains,因此我希望直接调用目标域。但是,性能下降意味着委托正在调用默认域,然后编组到真正的目标。我确实看到了UM2MDoADCallBack当逐步进行反汇编时。哪个显示在下面WrongAppDomain: in UMThunkStub.asm https://github.com/dotnet/coreclr/blob/master/src/vm/amd64/UMThunkStub.asm

如何防止这种不必要的封送并直接调用特定的 AppDomain?

我用来测试这个的代码如下。

#pragma unmanaged
#include <wtypes.h>
#include <cstdint>
#include <cwchar>

typedef void (__stdcall *ManagedUpdatePtr)();

struct ProfileSample
{
    static uint64_t frequency;
    uint64_t startTick;
    wchar_t* name;
    int count;

    ProfileSample(wchar_t* name_, int count_)
    {
        name = name_;
        count = count_;

        LARGE_INTEGER win32_startTick;
        QueryPerformanceCounter(&win32_startTick);
        startTick = win32_startTick.QuadPart;
    }

    ~ProfileSample()
    {
        LARGE_INTEGER win32_endTick;
        QueryPerformanceCounter(&win32_endTick);
        uint64_t endTick = win32_endTick.QuadPart;

        uint64_t deltaTicks = endTick - startTick;
        double nanoseconds = (double) deltaTicks / (double) frequency * 1000000000.0 / count;

        wchar_t buffer[128];
        swprintf(buffer, _countof(buffer), L"%s - %.4f ns\n", name, nanoseconds);
        OutputDebugStringW(buffer);

        if (!IsDebuggerPresent())
            MessageBoxW(nullptr, buffer, nullptr, 0);
    }
};

uint64_t ProfileSample::frequency = 0;

int CALLBACK
WinMain(HINSTANCE, HINSTANCE, PSTR, INT)
{
    LARGE_INTEGER frequency;
    QueryPerformanceFrequency(&frequency);
    ProfileSample::frequency = frequency.QuadPart;

    ManagedUpdatePtr GetManagedUpdatePtr();
    auto managedUpdate = GetManagedUpdatePtr();

    //Warm stuff up
    for ( size_t i = 0; i < 100; i++ )
        managedUpdate();

    const int num = 10000000;
    {
        ProfileSample p(L"ManagedUpdate", num);

        for ( size_t i = 0; i < num; i++ )
            managedUpdate();
    }

    return 0;
}

#pragma managed
using namespace System;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;

ref struct ManagedObject : MarshalByRefObject
{
    ManagedUpdatePtr
    GetManagedUpdatePtr()
    {
        auto delegate = gcnew Action(this, &ManagedObject::ManagedUpdate);

        IntPtr fPtr = Marshal::GetFunctionPointerForDelegate(delegate);
        return (ManagedUpdatePtr) fPtr.ToPointer();
    }

    void ManagedUpdate()
    {
        //Debug::WriteLine("\n\nManagedUpdate ({0})", (Object^) AppDomain::CurrentDomain->FriendlyName);
    }
};


ManagedUpdatePtr
GetManagedUpdatePtr()
{
    auto pluginDomain = AppDomain::CreateDomain("Plugin Domain");
    auto managedObject = (ManagedObject^) pluginDomain->CreateInstanceAndUnwrap("ManagedHelper", "ManagedObject");

    return managedObject->GetManagedUpdatePtr();
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当目标位于另一个 AppDomain 中时,非托管到托管的回调要慢得多 的相关文章

  • 由于“erf”函数使用率较高而导致性能瓶颈

    我使用大型矩阵 100x100 到 3000x3000 进行一些计算 大量求和和矩阵向量乘法 我使用 Eigen 库来处理向量和矩阵 我的代码是简单的类似 C 的代码 只有函数 没有类 并将被编译为 DLL 以在 Excel 上使用 我发现
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • CLR 使用实体框架检测到无效程序

    我正在从 wordpress 数据库中检索数据 该数据库将主键定义为decimal我在项目中使用 x64 配置 我搜索了一下发现这就是问题所在 但我找不到解决方案 我需要做什么 下载才能使用decimal作为主键 Microsoft Con
  • 为什么 pgAdmin 4 这么慢?

    postgreSQL 的 pgAdmin 4 GUI 非常慢 即使扩展服务器树或数据库树也需要花费太多时间 它们各自花费了近 30 秒的时间来展开 创建新数据库或表时它也会挂起 即使加载后 创建和保存新数据库也需要一分多钟的时间 几乎每次我
  • 使用 apply 函数重写循环

    我有以下 3 个函数 我想使其更快 我认为应用函数是最好的方法 但我从未使用过应用函数 所以我不知道该怎么做 任何类型的提示 想法和代码片段将不胜感激 n T dt 是全局参数 par 是参数向量 函数 1 是创建 m 1 n 矩阵的函数
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • 如何使这个自定义工作表初始化更快?

    Summary 这个问题在某种程度上是这个问题的后续 如何从索引实现列自命名 https stackoverflow com questions 5160001 how to implement column self naming fro
  • 为什么调用指定命名空间的函数会更慢?

    我认为指定我给出的命名空间R要做的工作更少 但我可能是错的 library microbenchmark gt microbenchmark unique default c 1 1 10 base unique default c 1 1
  • servicestack 自托管服务使用分块编码 - 是无缓冲的吗?

    我正在尝试通过 hello world 示例和自托管示例来学习 ServiceStack 我正在请求 JSON 内容 我在响应标头中注意到以下内容 ASP Net 项目中托管的基本服务 HTTP 1 1 200 OK Server ASP
  • ListView 与 getView() 由于不断的 GC 而变得缓慢?

    我的应用程序中有一个 ListView 并且我已经重写了 getView 方法 因此我可以根据行的文本更改行的 ImageView src 问题是 我注意到 ListView 滚动滞后 当我检查 DDMS 时 似乎每次滚动 ListView
  • 递归算法无法在指定时间内完成测试

    我正在进行一项测试 需要二进制断层扫描算法 提供了一组 38 个测试值来测试正确性 但完成所有测试也有 1 CPU 秒的时间限制 问题如下 如果存在 m n 矩阵 A 且每个元素为 0 或 1 则输出 Yes 使得 否则输出 否 对于每个测
  • C# 指针与 C++ 指针

    我一直在学习编程 并选择 C 和 C 编程作为第一语言 更具体地说 我有一本旧的 C 书 有人好心地借给我 我用它来学习 C 我使用 Visual Studio Express 并使用 C 和 C 编写 我感兴趣的一个领域是直接内存管理的能
  • 流畅的界面是否会显着影响 .NET 应用程序的运行时性能?

    我目前正忙于为现有技术实现一个流畅的接口 这将允许类似于以下代码片段的代码 using var directory Open Directory path to some directory using var file Open File
  • 3Leetcode求和算法

    我在使用 3sum 算法的以下输入时遇到问题 我是 得到 超过时间限制 我的算法对于这个输入来说太慢了吗 有什么建议如何改进吗 leetcode原题 给定一个由 n 个整数组成的数组 nums nums 中是否存在元素 a b c 使得 a
  • C# 以编程方式访问 Excel 宏

    我正在使用 Excel 文件的目录来获取有关每个文件的信息 我正在尝试使用 C Excel 互操作来收集有关与其中一些文件关联的 VBA 宏的信息 其代码如下 问题在于 所有 Excel 文件都没有启用对宏的编程访问 我可以在文件的本地副本
  • 从 C# 创建 Win32 事件

    我想从 C 创建一个内核 又名事件 我是否必须互操作服务并包装本机 CreateEvent 函数 或者是否已经有一个 NET 类可以完成这项工作 我需要运行的函数应该是这样的 hEvent CreateEvent NULL false fa
  • 如何编写通用 C 函数来调用 Win32 函数?

    为了允许从脚本语言 用 C 编写 访问 Win32 API 我想编写一个如下所示的函数 void Call LPCSTR DllName LPCSTR FunctionName LPSTR ReturnValue USHORT Argume
  • Python:Pycharm 运行时

    我目睹了 PyCharm 的一些奇怪的运行时问题 解释如下 该代码已在具有 20 个内核和 256 GB RAM 的机器上运行 并且有足够的空闲内存 我没有展示任何实际功能 因为它是一个相当大的项目 但我非常乐意根据要求添加详细信息 简而言
  • C# 中如何实现引用返回?

    既然 C GC 可以移动内存 那么如何实现引用返回呢 下面的代码会导致 未定义的行为 吗 public struct Record public int Hash public VeryLargeStruct Data public cla
  • 为 COM 互操作注册、gac 程序集时顺序重要吗?

    在为 COM Interop 注册 NET 程序集时 我做了两件事 目前按以下顺序进行 regasm tlb MyDll tlb Mydll dll gacutil i Mydll dll I use regasm为 COM 注册类型库并g

随机推荐

  • CloudFront 分配未显示为 Route53 别名目标

    我正在尝试添加指向我的 Cloudfront 分发的路线 53 记录集 但是 当我在路由 53 中选择 创建记录集 并单击后续面板中的别名目标时 未列出云前端分布 我得到的只是 没有可用的目标 我的发行版已创建并已启用 并且正在运行 我已在
  • ChromeDriver 2.33 的 driver.manage().window().maximize() 问题

    ChromeDriver 2 33 的发行说明表示 修复了导致调整大小 定位窗口命令在 Chrome 62 上失败的错误 但是当我使用 Chrome 62 浏览器时这似乎仍然是一个问题 使用 chrome 驱动程序最大化 chrome 窗口
  • 如何在 PHP 中设置 $PATH?

    我目前正在开发自己的小项目 但有一个小问题 我想将 PATH 环境变量设置为 bin 这样当我使用exec 和类似的功能 它只会搜索该目录中的二进制文件 除非我明确告诉它 我已经尝试过了putenv 除非我启用了安全模式 否则它将无法工作
  • Elasticsearch - 如果术语出现频率越高,得分越高

    我有 2 个文档 正在搜索关键字 Twitter 假设两个文档都是带有 标签 字段的博客文章 文档 A 在 标签 字段中只有 1 个术语 它是 Twitter 文档 B 在 标签 字段中有 100 个术语 但其中 3 个是 Twitter
  • Erlang 代码的持续集成服务器

    您使用什么类型的敏捷工具进行 Erlang 开发 什么持续集成 http en wikipedia org wiki Continuous integration您使用 CI 服务器来构建 Erlang 代码吗 我得到的唯一参考来自 Quo
  • Maven 中央存储库的官方镜像有哪些?

    有谁知道是否有已知 和工作的 Maven 中央存储库 http repo1 maven org maven2 镜像的列表 如果没有 当中央存储库关闭时您使用什么镜像 这是取自 rvxnet 的答案 以及为什么仅链接答案不可取的示例 我从20
  • Tomcat 的接受计数

    我对Tomcat有以下问题acceptCount 它说 当所有传入连接请求的最大队列长度 可能的请求处理线程正在使用中 收到的任何请求 当队列已满时将被拒绝 默认值为 10 我不确定这是如何运作的 我的意思是我知道有一个单独的 TCP 队列
  • QScreenRayCaster 未找到实体。我做错了什么?

    Qt3D 中新 QScreenRayCaster 的描述看起来正是我想要使用的 但我无法让它为我工作 我想在初始化中我需要做一些事情 但我在网上找不到任何示例来为我指明正确的方向 我编写了一个非常简单的程序来测试该功能 它在窗口的中心绘制一
  • Spring Security 将 URL 参数传递给身份验证提供程序

    有没有办法将 URL 参数传递给 Spring Security 3 中的身份验证提供程序 我们的登录页面需要接收电子邮件令牌作为参数 身份验证系统在设置用户状态时需要了解该参数 具体来说 它将允许具有正确令牌的用户登录 否则该用户将无法登
  • Pandas 根据拆分另一列添加新列

    我有一个如下所示的 pandas 数据框 A B US 65 AMAZON 2016 US 65 EBAY 2016 我的目标是看起来像这样 A B country code com US 65 AMAZON 2016 US 65 AMAZ
  • PE 文件中的 OSMajor 和 OSMinor 版本号

    最近我偶然发现了一个奇怪的现象 我正在为 PE 文件构建一个转储程序 很好地阅读了节标题和 可选 节标题 现在 当我到达 OS Major 和 OS Minor 字段时 我注意到一个奇怪的值 WORD OS VERSION major 0x
  • 我应该在 URL 中使用重音字符吗?

    当用英语以外的语言创建网页内容时 搜索引擎优化和用户友好 URL 的问题就会出现 我想知道在 URL 中使用去重音字母是否是最佳实践 冒着某些单词在有或没有某些重音的情况下具有完全不同含义的风险 或者最好坚持使用非英语字符在不太高级的环境
  • CCAvenue:“解密应用程序请求时出错!”

    我正在尝试将 CCAvenue 支付网关集成到我用 swift 4 开发的 iOS 应用程序中 我正进入 状态 错误 解密应用程序请求时出现问题 我已检查以下网址给出的答案 https stackoverflow com a 3732712
  • codegen 和标量结构参数

    Codegen 命令如下 codegen config dll ep1 args single 0 ep2 args 0 0 对于这样的函数来说很容易 function y ep1 u codegen y u function y ep2
  • Python基线校正库

    我目前正在处理一些拉曼光谱数据 并且正在尝试纠正由花期偏差引起的数据 看看下面的图表 我已经非常接近实现我想要的了 正如您所看到的 我试图在所有数据中拟合多项式 而我实际上应该在局部最小值处拟合多项式 理想情况下 我想要一个多项式拟合 当从
  • 如何确定 rspec 控制器测试的主题?

    所以除了好奇之外 我没有什么充分的理由需要知道这一点 最好的理由 但我不确定这里发生了什么 背景 我正在研究 RSpec 书并更新示例 第 24 章 Rails 控制器有一个消息控制器的测试 spec controllers message
  • .NET 结构中的成员相等测试使用什么算法?

    NET 结构中的成员相等测试使用什么算法 我想知道这一点 以便我可以将其用作我自己的算法的基础 我正在尝试为任意对象 在 C 中 编写递归成员相等测试 以测试 DTO 的逻辑相等性 如果 DTO 是结构 则这会容易得多 因为 ValueTy
  • 如何在 blazor wasm 中创建可供下载的 pdf

    在 blazor wasm 中 我想创建一个 pdf 并使其可下载 我测试过pdfflow https www pdfflow io 但只能使其在控制台应用程序中运行 有几种商业解决方案 devexpress syncfusion 但它们确
  • 如何更改 core-image-minimal yocto 中的 init 系统

    我想根据以下内容创建一个新目标core image minimal我想更改 init 系统systemd over SysV init 我希望我的更改是永久性的 不基于 local conf 我怎样才能做到这一点 Edit 正如安德斯在评论
  • 当目标位于另一个 AppDomain 中时,非托管到托管的回调要慢得多

    我使用委托从非托管代码调用托管代码 当我调用默认 AppDomain 中的托管代码时 我测量到每次调用的平均时间为 5 4 纳秒 当我调用第二个 AppDomain 时 我测量到每次调用需要 194 纳秒 默认VS2017 x86发布配置