Cha*_*les 6 c c++ hardware cpu cpu-architecture
我有一个用C语言编写的库,我有两个用C++和C编写的应用程序.这个库是一个通信库,所以其中一个API调用如下所示:
int source_send( source_t* source, const char* data );
Run Code Online (Sandbox Code Playgroud)
在C应用程序中,代码执行以下操作:
source_t* source = source_create();
for( int i = 0; i < count; ++i )
source_send( source, "test" );
Run Code Online (Sandbox Code Playgroud)
C++应用程序执行此操作的位置:
struct Source
{
Source()
{
_source = source_create();
}
bool send( const std::string& data )
{
source_send( _source, data.c_str() );
}
source_t* _source;
};
int main()
{
Source* source = new Source();
for( int i = 0; i < count; ++i )
source->send( "test" );
}
Run Code Online (Sandbox Code Playgroud)
在英特尔酷睿i7上,C++代码每秒产生的消息几乎增加了50%.而在英特尔酷睿2双核处理器上,它每秒产生的消息数量几乎完全相同.(核心i7有4个核心,每个核心有2个处理线程)
我很好奇硬件执行什么样的魔术才能解决这个问题.我有一些理论,但我想我会得到一个真正的答案:)
编辑:评论中的其他信息
编译器是visual C++,所以这是一个windows box(两者都是)
通信库的实现创建了一个新线程来发送消息.source_create是创建此线程的原因.
从单独检查源代码开始,我看不出为什么C++代码应该更快的原因.
我要做的下一件事是检查正在生成的汇编代码.如果您使用的是GNU工具链,那么您有几种方法可以做到这一点.
您可以通过-S命令行参数请求gcc和g ++输出汇编代码.确保添加该参数的其他参数,您使用与常规编译完全相同的命令行参数.
第二个选项是使用gdb加载程序并使用该disas命令.
祝好运.
更新
您可以使用Microsoft工具链执行相同的操作.
要使编译器输出汇编,可以使用/ FA或/ FAs.第一个应该只输出组件,而第二个将组合组件和源(这应该更容易遵循).
至于使用调试器,一旦在Visual Studio中启动调试器,导航到"Debug | Windows | Disassembly"(在Visual Studio 2005上验证,其他版本可能会有所不同).
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |