小编Mat*_*nik的帖子

为什么.NET中的矩阵乘法如此之慢?

我不太明白是什么使C#/ .NET(甚至Java)中的矩阵乘法变得如此之慢.

看一下这个基准测试(来源):试图找到更新的基准测试.

Java vs C#vs C++细分http://img411.imageshack.us/img411/9324/perf.gif

C#的整数和双重性能非常接近用MSVC++编译的C++.双精度为87%,32位整数为99%.非常好,我会说.但接下来看矩阵乘法.差距扩大到C#的速度约为19%.这是一个非常大的差异,我不明白.矩阵乘法只是一堆简单的数学运算.怎么这么慢?它不应该与等量的简单浮点或整数运算一样快吗?

这尤其是游戏和XNA的关注点,其中矩阵和矢量性能对物理引擎等事物至关重要.前一段时间,Mono通过一些漂亮的矢量和矩阵类增加了对SIMD指令的支持.它缩小了差距,使Mono比手写的C++更快,尽管没有C++与SIMD一样快.(来源)

矩阵乘法比较http://img237.imageshack.us/img237/2788/resultse.png

这里发生了什么?

编辑:仔细观察,我误读了第二张图.C#看起来非常接近.第一个基准测试只是做了可怕的错误吗?对不起,我错过了第一个基准测试的版本号.我抓住它作为我总是听到的"C#线性代数很慢"的方便参考.我会试着找另一个.

.net c# performance xna matrix-multiplication

15
推荐指数
3
解决办法
9172
查看次数

使用WM_COPYDATA将结构从C++发送到WPF

我有一个本机C++应用程序,暂时只需要将其命令行字符串和当前鼠标光标坐标发送到WPF应用程序.消息发送和接收都很好,但我无法将IntPtrC#中的实例转换为结构.

当我尝试这样做时,应用程序将无异常崩溃,或者跳过转换它的代码行并接收循环中的下一条消息.这可能意味着发生了原生异常,但我不知道为什么.

这是C++程序.暂时我忽略了命令行字符串并使用伪光标坐标来确保工作正常.

#include "stdafx.h"
#include "StackProxy.h"
#include "string"

typedef std::basic_string<WCHAR, std::char_traits<WCHAR>> wstring;

struct StackRecord
{
    //wchar_t CommandLine[128];
    //LPTSTR CommandLine;
    //wstring CommandLine;
    __int32 CursorX;
    __int32 CursorY;
};

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    COPYDATASTRUCT data;
    ZeroMemory(&data, sizeof(COPYDATASTRUCT));

    StackRecord* record = new StackRecord();

    wstring cmdLine(lpCmdLine);
    //record.CommandLine = cmdLine;
    record->CursorX = 5;
    record->CursorY = 16;
    data.dwData = 12;
    data.cbData = sizeof(StackRecord);
    data.lpData = record;

    HWND target = FindWindow(NULL, _T("Window1"));

    if(target != NULL)
    {
        SendMessage(target, WM_COPYDATA, …
Run Code Online (Sandbox Code Playgroud)

c++ wpf interop marshalling wm-copydata

7
推荐指数
1
解决办法
6460
查看次数

使用std :: tr1 :: function(或boost :: function)创建多播事件

我正在尝试使用TR1中的功能创建类似C#的多播委托和事件.或者Boost,因为boost :: function(大部分)与std :: tr1 :: function相同.作为概念证明,我试过这个:

template<typename T1>
class Event
{
private:
 typedef std::tr1::function<void (T1)> action;
 std::list<action> callbacks;

public:

 inline void operator += (action func)
 {
  callbacks.push_back(func);
 }

 inline void operator -= (action func)
 {
  callbacks.remove(func);
 }

 void operator ()(T1 arg1)
 {
  for(std::list<action>::iterator iter = callbacks.begin();
   iter != callbacks.end(); iter++)
  {
   (*iter)(arg1);
  }
 }
};
Run Code Online (Sandbox Code Playgroud)

哪个有用,有点像.这条线callbacks.remove(func)没有.当我编译它时,我收到以下错误:

error C2451: conditional expression of type 'void' is illegal
Run Code Online (Sandbox Code Playgroud)

这是由函数中的list标题的第1194行引起的remove.是什么造成的?

c++ delegates boost stl tr1

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

GWT TabLayoutPanel始终处于折叠状态

我有一个简单的TabLayoutPanel用UIBinder制作.选项卡呈现但没有内容.它在HTML中,但它总是折叠(元素上设置的内联样式使其崩溃).据我所知,这与我见过的每个TabLayoutPanel示例相同.其他小部件渲染得很好.该项目只是默认HTML和代码被剥离的基本示例.

XML是:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
 xmlns:g="urn:import:com.google.gwt.user.client.ui">
 <g:TabLayoutPanel barHeight='22' barUnit='PX'>
  <g:tab>
   <g:header>Tab A</g:header>
   <g:HTML>
   asdf
   <p>asdfasdf</p>
   </g:HTML>
  </g:tab>
  <g:tab>
   <g:header>Tab B</g:header>
   <g:Label>blah</g:Label>
  </g:tab>
  <g:tab>
   <g:header>Tab C</g:header>
   <g:Label>blah</g:Label>
  </g:tab>
 </g:TabLayoutPanel>
</ui:UiBinder>
Run Code Online (Sandbox Code Playgroud)

而Java是:

public class Main extends Composite {

 private static MainUiBinder uiBinder = GWT.create(MainUiBinder.class);

 interface MainUiBinder extends UiBinder<Widget, Main> {
 }

 public Main() {
  initWidget(uiBinder.createAndBindUi(this));
 }
}
Run Code Online (Sandbox Code Playgroud)

我将它添加到我的应用程序中,如下所示:

public void onModuleLoad() {
  RootPanel.get().add(new Main());
 }
Run Code Online (Sandbox Code Playgroud)

我惊呆了.这应该很简单.我一定是想念一些愚蠢的事.有任何想法吗?

gwt uibinder gwt-tablayoutpanel

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

复制GWT的TabLayoutPanel的<g:tab>元素

我发现GWT选项卡面板对于我需要做的样式很笨拙,所以我正在尝试制作我自己的简单选项卡面板.基本上是<nav>标签的HTML5 元素和DeckPanel显示内容的a.让我们用CSS3来解决剩下的问题.

GWT TabLayoutPanel具有这些"特殊"标记,用于定义选项卡的内容:

<g:TabLayoutPanel>
    <g:tab>
        <g:header>Tab Title</g:header>
        <g:OtherWidget>Tab contents</g:OtherWidget>
    </g:tab>
</g:TabLayoutPanel>
Run Code Online (Sandbox Code Playgroud)

我指的是<g:tab><g:header>.我看到在各个地方使用这些类型的标签,但我不知道如何创建它们.查看TabLayoutPanel源代码,我发现它有一个add方法需要两个小部件,然后它将一个小部件(内容)放入一个面板进行显示,将另一个小部件(标题)放入一个TabLayoutPanel.Tab实例中.但我不知道如何复制这种功能.

gwt uibinder

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

Photon vmware的优点和缺点

作为Photon的新手,我有以下问题:

看起来VMware正在尝试为Docker创建并行容器技术.由于码头工人在这个阶段比较成熟,使用光子是否有任何好处/优势?

据我所知,人们可以在光学的前提下创建类似AWS的环境(由于我可以在新的光子容器上启动新的服务实例 - 裸机与拉动码头图像),因此可以处理端口暴露.

它是否为管理/维护增加了另一层复杂性?Docker可以在主机上的最小linux上运行.那么我有什么收获?看起来这是将服务器划分为更小的VM的更好方法.

对不起,对于漫无边际的问题.我不确定除了AWS之外是否存在增值,就像我可以用它创建的环境一样.甚至,我不确定.谢谢

vmware docker photon-controller photon-os

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