我不太明白是什么使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#线性代数很慢"的方便参考.我会试着找另一个.
我有一个本机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) 我正在尝试使用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.是什么造成的?
我有一个简单的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选项卡面板对于我需要做的样式很笨拙,所以我正在尝试制作我自己的简单选项卡面板.基本上是<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实例中.但我不知道如何复制这种功能.
作为Photon的新手,我有以下问题:
看起来VMware正在尝试为Docker创建并行容器技术.由于码头工人在这个阶段比较成熟,使用光子是否有任何好处/优势?
据我所知,人们可以在光学的前提下创建类似AWS的环境(由于我可以在新的光子容器上启动新的服务实例 - 裸机与拉动码头图像),因此可以处理端口暴露.
它是否为管理/维护增加了另一层复杂性?Docker可以在主机上的最小linux上运行.那么我有什么收获?看起来这是将服务器划分为更小的VM的更好方法.
对不起,对于漫无边际的问题.我不确定除了AWS之外是否存在增值,就像我可以用它创建的环境一样.甚至,我不确定.谢谢