相关疑难解决方法(0)

为什么lambdas可以通过编译器比普通函数更好地优化?

The C++ Standard Library (Second Edition)Nicolai Josuttis 在其着作中指出,编译器可以比普通函数更好地优化lambdas.

此外,C++编译器比普通函数更好地优化lambdas.(第213页)

这是为什么?

我认为在内联时不应该有任何差别.我能想到的唯一原因是编译器可能有一个更好的本地上下文与lambdas,这样可以做出更多假设并执行更多优化.

c++ optimization lambda compiler-optimization c++11

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

数组边界检查.net 4及更高版本的效率

我对.net中有效的低级算法感兴趣.我想让我们选择在C#而不是C++中编写更多的代码,但是一个绊脚石就是.net中的边界检查,它发生在循环和随机访问数组时.

激励示例是计算两个数组中相应元素的乘积之和的函数(这是两个向量的点积).

static void SumProduct(double[] X, double[] Y)
{
    double sum = 0;
    int length = X.Length;
    if (length != Y.Length)
        throw new ArgumentException("X and Y must be same size");
    for (int i = 0; i < length; i++) // Check X.Length instead? See below
        sum += X[i] * Y[i];
}
Run Code Online (Sandbox Code Playgroud)

从我所知道的,并且不知道足够的IL或x86来检查,编译器将不会优化X 和的 边界检查Y.我错了和/或有没有办法编写我的代码以允许编译器帮助我?

更多详情

有许多效率论据支持和反对使用特定语言,尤其是最好专注于"大O"算法成本而不是比例常数,而更高级别的语言可以帮助您实现这一目标.关于.net中边界检查的主题,我发现的最好的文章是MSDN上的CLR中的数组边界检查消除(也在关于启用优化的重要性的堆栈溢出答案中引用).

这可以追溯到2009年,所以我想知道从那时起事情是否发生了重大变化.此外,文章揭示了一些真正的微妙之处,这些微妙之处本来就让我感到高兴,因此仅此一点,我欢迎一些专家建议.

例如,似乎在上面的代码中,我最好i< X.Length不要写作而不是i < length.此外,我还天真地假设对于具有单个数组的算法,编写foreach循环将更好地向编译器声明您的意图并为其提供优化边界检查的最佳机会.

根据MSDN文章,SumForBAD下面,我认为肯定会优化,不会.虽然SumFor可以直接优化,SumForEach …

.net c# performance bounds-check-elimination

47
推荐指数
3
解决办法
1万
查看次数

快速C++程序,C#GUI,可能吗?

我正在研究开发一种应用程序,它将以每秒约2000行(帧)的速度处理来自线扫描相机的数据.对于这个实时应用程序,我觉得C/C++是要走的路.(这是我的感觉,其他人会同意托管代码不适合这项任务.)

不过,我已经做了非常少的MFC或任何其他的C++图形用户界面.不过,我真的很想做C#GUI.

所以我很自然地用C/C++编写数据密集型代码,用C#编写GUI.GUI将用于设置/校准/在线监控(并可能通过UDP输出数据,因为它在C#中更容易.

首先,我想看看是否有人同意这将是要走的路.根据我的编程经验(擅长低级C算法和高级C#GUI设计),感觉恰到好处.

其次,我不确定正确的方法.我只是在VS2005中汇总了一个解决方案,它从C#应用程序中调用了一些(extern"C")DLL函数.为了确保我能做到这一点,我写了DLL中的一些全局变量,并从中读取:

test.h

int globaldata;
extern "C" __declspec(dllexport) void set(int);
extern "C" __declspec(dllexport) int  get();
Run Code Online (Sandbox Code Playgroud)

TEST.CPP

extern int data=0;
__declspec(dllexport) void set(int num) {
    data = num;
}

__declspec(dllexport) int get() {
    return data;
}
Run Code Online (Sandbox Code Playgroud)

test.cs中

[DllImport("test")]
private static extern void set(int num);

[DllImport("test")]
private static extern int get();
Run Code Online (Sandbox Code Playgroud)

调用get()set()正常工作(get()返回我传递给的数字set()).

现在,我知道您也可以导出C++类,但它是否必须进行管理?这是如何运作的?我是以正确的方式来做这件事的吗?

感谢你的帮助!

*** EDIT ***

首先,感谢您迄今为止的精彩答案!我总是对Stack Overflow印象深刻......

我想我应该更多地关注一件事,不一定是原始速度(这可以是原型和基准测试).让我更关心的一件事是垃圾收集器的非确定性行为.这个应用程序将不会在执行垃圾收集宽容500ms的延迟.

我只是编写代码并在纯C#中尝试这个,但如果我提前知道GC和任何其他非确定性的.NET行为(?)会导致问题,我认为我的时间会更好地用于编码C/C++并找出最好的C#接口.

c# c++ dll export

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

有没有理由在.NET上使用Win32 API(在C或C++中)?

我正在完成暑期工作,为行李扫描仪编写图形软件.一切都在.NET或MFC中完成,使用普通的C++进行硬件通信(我不做任何硬件工作).我有时使用Win32 API调用(如SendMessage)来提高表单或控件的性能.我只有一年的CS课程(全部用C语言),但我对Win32 API很着迷 - 它比我想象的要大得多,也更强大.

.NET是否只是隐藏了Win32 API的所有"乏味"或底层工作?最终软件在.NET中消耗更多系统资源还是执行速度更慢?

.net api winapi

11
推荐指数
4
解决办法
6267
查看次数

使用C#前端的C++后端?

我有一个项目,如果不是1000秒的消息,我将不得不处理100秒,并相应地处理/绘制图表上的数据(用户将搜索一组数据,其中图表将实时绘制,不必在图表上绘制1000个值.)

我无法理解使用dll在C++中进行大量的消息处理,然后将信息传递到C#接口.有人可以在这里为我愚蠢吗?

此外,由于速度将是一个优先级,我想知道是否访问跨越2个不同的代码层将有更多的性能命中,在C#中完整地编程项目,或者当然,我读过关于编程GUI的坏事在C++中,这个应用程序也必须看起来现代,干净,专业等等所以我认为C#将是前进的方向(也许是XAML,wPF)

谢谢你的时间.

c# c++ wpf performance user-interface

9
推荐指数
2
解决办法
8876
查看次数

C++ vs .NET正则表达式性能

在Konrad Rudolph关于相关问题的评论的提示下,我编写了以下程序来对F#中的正则表达式性能进行基准测试:

open System.Text.RegularExpressions
let str = System.IO.File.ReadAllText "C:\\Users\\Jon\\Documents\\pg10.txt"
let re = System.IO.File.ReadAllText "C:\\Users\\Jon\\Documents\\re.txt"
for _ in 1..3 do
  let timer = System.Diagnostics.Stopwatch.StartNew()
  let re = Regex(re, RegexOptions.Compiled)
  let res = Array.Parallel.init 4 (fun _ -> re.Split str |> Seq.sumBy (fun m -> m.Length))
  printfn "%A %fs" res timer.Elapsed.TotalSeconds
Run Code Online (Sandbox Code Playgroud)

以及C++中的等价物:

#include "stdafx.h"

#include <windows.h>
#include <regex>
#include <vector>
#include <string>
#include <fstream>
#include <cstdio>
#include <codecvt>

using namespace std;

wstring load(wstring filename) {
    const locale empty_locale = locale::empty(); …
Run Code Online (Sandbox Code Playgroud)

.net c++ regex

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

C#与C++性能比较

可能重复:
C++比C#快多少?

你好!

在实际应用中,C#是否比C++更快(具有更好的性能)?

我听说泛型集合比stl具有显着的性能优势 - 这是真的吗?

用C#编写的本机代码(不安全块,引脚指针,Marshal ......)与C++本地编写的相同代码具有相同的性能吗?

c# c++ performance

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