使用C+会出现性能问题吗+;在C#内? 我有一个C++程序,它对40K的记录进行文本处理。我们开发了这个C++程序,因为我们认为它会更快。然后我使用进程执行在C++程序中使用/执行这个C++部分,但问题是我们感觉失去了对执行流的控制:不能调试C++部分。我想在C++程序中集成更多的C++。我搜索了Google,发现我必须为我的C++生成一个DLL,然后我可以在我的C语言程序中使用它。

使用C+会出现性能问题吗+;在C#内? 我有一个C++程序,它对40K的记录进行文本处理。我们开发了这个C++程序,因为我们认为它会更快。然后我使用进程执行在C++程序中使用/执行这个C++部分,但问题是我们感觉失去了对执行流的控制:不能调试C++部分。我想在C++程序中集成更多的C++。我搜索了Google,发现我必须为我的C++生成一个DLL,然后我可以在我的C语言程序中使用它。,c#,c++,performance,C#,C++,Performance,问题: LI>这会减慢C++部分的执行速度吗? LI>还有其他更好的方法来将C++部分集成到我的C语言程序中吗? DLL内部包装C++代码不会以任何方式降低它。 是的,与在可执行文件中调用函数不同,在DLL中调用函数会有(轻微的)性能损失-例如,编译器不能内联调用。但这通常是完全可以忽略不计的开销(3-5条CPU指令) 这可能是最简单的方法 DLL内部的C++代码不会以任何方式降低它。 是的,与在可执行文件中调用函数不同,在DLL中调用函数会有(轻微的)性能损失-例如,编译器不能内联调用

问题:

<> LI>这会减慢C++部分的执行速度吗? <> LI>还有其他更好的方法来将C++部分集成到我的C语言程序中吗?

DLL内部包装C++代码不会以任何方式降低它。

是的,与在可执行文件中调用函数不同,在DLL中调用函数会有(轻微的)性能损失-例如,编译器不能内联调用。但这通常是完全可以忽略不计的开销(3-5条CPU指令)


这可能是最简单的方法

<包装> DLL内部的C++代码不会以任何方式降低它。

是的,与在可执行文件中调用函数不同,在DLL中调用函数会有(轻微的)性能损失-例如,编译器不能内联调用。但这通常是完全可以忽略不计的开销(3-5条CPU指令)


这可能是最简单的方法

如果不进行测量,你就无法判断这是否足够快以实现你的目标。尽可能简单地(在DLL中包上现有的C++代码),看看它是否符合你的性能目标。我猜可能会的


从托管中调用本机代码在每次方法调用中都会有一些开销-如果您的程序受到严重的计算限制,并且将在每个记录中多次调用本机方法,那么您可能会看到由于互操作而导致的速度减慢。如果您的代码只调用一次本机代码以批量处理所有40k记录,那么执行互操作的成本将大大低于处理记录所花费的实际时间。如果记录来自速度较慢的存储介质(如通过网络),则与I/O时间相比,您的处理时间可能微不足道。

如果不进行测量,您无法判断这是否足够快以满足您的目标。尽可能简单地(在DLL中包上现有的C++代码),看看它是否符合你的性能目标。我猜可能会的


从托管中调用本机代码在每次方法调用中都会有一些开销-如果您的程序受到严重的计算限制,并且将在每个记录中多次调用本机方法,那么您可能会看到由于互操作而导致的速度减慢。如果您的代码只调用一次本机代码以批量处理所有40k记录,那么执行互操作的成本将大大低于处理记录所花费的实际时间。如果记录来自较慢的存储介质(如通过网络),则与I/O时间相比,您的处理时间可能可以忽略不计。

您可以在此处选择:

  • 在.NET中编写处理并测量性能。如果不可接受,则尝试对其进行优化。如果仍然太慢,则恢复为非托管代码。但认为非托管代码会更快,因此在不测量IMHO的情况下编写非托管代码是错误的方法

  • 由于您已经编写了非托管代码,您可以通过导出将执行处理的函数将其公开为动态链接库:

    extern "C" __declspec(dllexport) int DoProcessing(int);
    
    接下来,在托管代码中导入函数:

    class Program 
    {
        [DllImport("mylibrary.dll")]
        static extern int DoProcessing(int input);
        static void Main()
        {
            int result = DoProcessing(123);
        }
    }
    
    如果处理的输入和输出不是很复杂,并且可以很容易地封送,那么这种方法是有效的。它的开销很小

  • 使用as托管程序集编译非托管代码并直接引用它


  • 您在这里有几个选项:

  • 在.NET中编写处理并测量性能。如果不可接受,则尝试对其进行优化。如果仍然太慢,则恢复为非托管代码。但认为非托管代码会更快,因此在不测量IMHO的情况下编写非托管代码是错误的方法

  • 由于您已经编写了非托管代码,您可以通过导出将执行处理的函数将其公开为动态链接库:

    extern "C" __declspec(dllexport) int DoProcessing(int);
    
    接下来,在托管代码中导入函数:

    class Program 
    {
        [DllImport("mylibrary.dll")]
        static extern int DoProcessing(int input);
        static void Main()
        {
            int result = DoProcessing(123);
        }
    }
    
    如果处理的输入和输出不是很复杂,并且可以很容易地封送,那么这种方法是有效的。它的开销很小

  • 使用as托管程序集编译非托管代码并直接引用它

  • 试着用C#实现它

    4万张唱片似乎是一个很低的数字。这可能是(取决于您需要对每条记录进行多少处理)在C#中处理40k条记录实际上比像您目前这样生成流程还要快

    另一种方法是将C应用程序编译成dll并在进程中加载。这仍然会有一些开销,但比产生一个额外的进程要小得多

    尝试在C#中实现它

    4万张唱片似乎是一个很低的数字。这可能是(取决于您需要对每条记录进行多少处理)在C#中处理40k条记录实际上比像您目前这样生成流程还要快


    另一种方法是将C应用程序编译成dll并在进程中加载。这仍然会有一些开销,但它比生成一个额外的进程要小得多

    我同意AdamRalph的观点-我认为在CPP中编写这段代码只会带来集成方面的痛苦


    顺便说一句,CPP代码是否管理?如果是这样的话,你为什么不把它链接到你的C代码中,避免所有的互操作开销呢?我同意AdamRalph的观点,我认为用CPP编写这段代码只会带来集成方面的痛苦

    顺便说一句,CPP代码是否管理?如果是这样的话,你为什么不把它链接到你的C代码中,避免所有的互操作开销呢

    你能格式化你的帖子吗?你有没有试过