真 OO无双之真乱舞书
写程序是一件很快乐的事 Since 2006/10/22
C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

2006年11月12日

STL的std::vector和.NET的ArrayList,何者速度较快?

之前我发表了如何用C++开发ASP.NET,很多人怀疑用C++开发ASP.NET有什么好处?执行速度上有任何优势吗?第一个问题将在本篇随笔解答,至于执行速度,我认为既然都是managed code,C++/CLI、C#、VB应该都一样快,但C++/CLI有个特色,就是能在managed code中写unmanaged code,类似C#的unsafe code,假如在C++/CLI中使用unmanaged code,是否能在速度上占便宜呢?我写了以下的程序作测试。


为了克服array必须事先宣告大小的不便,STL和.NET都有解决的方式,在STL的container当中,速度最快的就是std::vector,而.NET当中就是ArrayList,所以我想测试在同样的程序中,若使用unmanaged 的std::vector是否会比managed ArrayList快。

 1 /**/ /*  
 2 (C) OOMusou 2006  http://oomusou.cnblogs.com
 3
 4 Filename    : VectorVsArrayList.cpp
 5 Compiler    : Visual C++ 8.0
 6 Description : Demo std::vector and ArrayList in C++/CLI
 7 */

 8 #include  " stdafx.h "
 9 #include  < vector >
10 #include  < ctime >
11 #include  < iostream >
12
13 using   namespace  System;
14 using   namespace  System::Collections;
15
16 int  main()
17 {
18      //  Use STL std::vector
19     clock_t t1  =  clock();
20     
21     std::vector < int >  ivec;
22
23      for ( int  i = 0 ; i  !=   10000000 ;  ++ i)  {
24       ivec.push_back(i);
25     }

26
27     t1  =  clock()  -  t1;
28
29     std::cout  <<   " std::vector :  "   <<  ( double )t1 / CLOCKS_PER_SEC  <<   "  sec "   <<  std::endl;
30
31
32      //  Use .NET ArrayList
33     clock_t t2  =  clock();
34
35     ArrayList ^  al  =  gcnew ArrayList;
36      for ( int  i = 0 ; i  !=   10000000 ;  ++ i)  {
37       al -> Add(i);
38     }

39     t2  =  clock()  -  t2;
40
41     std::cout  <<   " .NET ArrayList :  "   <<  ( double )t2 / CLOCKS_PER_SEC  <<   "  sec "   <<  std::endl;
42
43      return   0 ;
44 }

执行结果

1 std::vector :  5.618  sec
2 .NET ArrayList :  4.336  sec
3 請按任意鍵繼續 . . .


执行结果令我讶异,我原本预期unmanaged的std::vector应该会比较快,但结果却是managed的ArrayList较快,我觉得可能的原因是,managed的数据放在CLR内,而unmanaged数据放在不同的地方,当unmanaged的std::vector要在managed的执行环境中显示时,还要经过marshaling的动作,所以浪费了一些时间,类似在.NET中使用COM的dll时,也必须经过marshaling,所以速度较慢。


回到我第一个问题,用C++开发ASP.NET有什么好处?在这个简单的程序里可以发现,C++/CLI的最大特色,让你可以将managed和unmanaged程序写在一起,同时使用.NET Framework和传统C++的library,如STL、boost,这是C#所做不到的,假如你的工程领域已经有很多library,是用C/C++写的,可能是10几年前的东西,目前根本没有C#版本的library,而你又急需这些library的function开发.NET程序,C++/CLI就很方便了,让你同时拥抱C/C++ library和.NET Framework,这也是Microsoft开发C++/CLI的原因。


结论
在C++/CLI开发managed code,执行速度不会比C#、VB快,虽然C++/CLI可以开发unmanaged code,但若.NET Framework有相对应的支持时,应先考虑.NET Framework,然后再考虑其它C++自己的library,当然C++/CLI不见的适合所有开发人员,但对于一些开发人员是很方便的。

posted @ 2006-11-12 11:17 真 OO无双 阅读(2757) | 评论 (8) | 编辑 收藏
 

2006年11月11日

如何在Linux使用Eclipse + CDT开发C/C++程序?

A. 为什么要在Linux使用Eclipse开发C/C++程序? 

Linux是一个以C/C++开发为主的平台,无论是Kernel或是Application,主要都使用C/C++开发。传统在Linux下开发程序,是在文字模式下,利用vi等文字编辑器撰写C/C++程序存盘后,在Command line下使用gcc编译,若要debug,则使用gdb。


这种开发方式生产力并不高,若只是开发学习用的小程序则影响不大,但若要开发大型项目时,程序档案个数众多,需要用project或solution的方式管理;且debug时breakpoint的加入,单步执行,观察变量变化等,都需要更可视化的方式才能够增加生产力;最重要的,由于现在的程序语言皆非常的庞大,又有复杂的函式库,要程序员熟记所有的程序语法和function名称,实在很困难,所以语法提示(Intellisense)的功能就非常重要,这些就必须靠IDE来达成。


在Windows平台上,若要开发C/C++程序,我们有Microsoft Visual Studio、Borland C++ Builder可用,这些都是很好用的IDE,但可惜仅能在Windows下使用,但是在Linux平台呢?基于以下理由,我推荐使用Eclipse开发C/C++程序:


1. Eclipse是一个用Java所撰写IDE,因此可跨平台,所以在Linux和Windows平台下皆可使用Eclipse,可降低程序员熟析IDE的学习曲线。


2. Eclipse虽然主要拿来开发Java程序,但事实上Eclipse为一个『万用语言』的IDE,只要挂上plugin后,就可以在Eclipse开发各种语言程序,所以我们只要挂上CDT(C/C++ Development Toolkit)后,就可以在Eclipse开发C/C++程序,除此之外,目前的主流程序语言,如C/C++、C#、Java、PHP、Perl、Python、Ruby、Rebol、JavaScript、SQL、XML、UML等,皆可在Eclipse上撰写,所以只要熟析Eclipse的IDE环境,将来若开发其它语言程序,就不用再重新学习IDE环境了。


3. 最重要的,Eclipse和CDT是Open Source且完全免费,取得相当容易,事实上Fedora 5已经包含Eclipse和CDT了,虽然预设Fedara 5安装时并没有含Eclipse,只要手动另外加选即可。


B. 如何在Linux下安装Eclipse和CDT? 
i. 由Linux Distribution安装Eclipse,Fedora 5就内含Eclipse和CDT。

ii. 手动安装
  1. 下载档案
    A、 下载JRE(Java Runtime Environment) 。(http://java.sun.com/javase/downloads/index.jsp)

    B、 下载Eclipse SDK。(http://www.eclipse.org/downloads/)

    C、 下载CDT。(http://www.eclipse.org/cdt/downloads.php)

  2. 安装
    A、 安装JRE
      i. [root@localhost ~]#mkdir /usr/local/java

      ii. (将档案jre-1_5_0_09-linux-i586-rpm.bin下载到/usr/local/java目录下)

      iii. (超级用户模式)
      [root@localhost ~]#su            

      iv.  [root@localhost ~]#cd /usr/java

      v. (将您所下载的档的权限更改为可执行)
      [root@localhost java]#chmod a+x jre-1_5_0_09-linux-i586-rpm.bin 

      vi. (启动安装过程)
      [root@localhost java]#./jre-1_5_0_09-linux-i586-rpm.bin
      (此时将显示二进制许可协议,按控格显示下一页,读完许可协议后,输入 『yes』继续安装。此时会将解压缩,产生jre-1_5_0_9-linux-i586.rpm)


      vii. (安装jre-1_5_0_9-linux-i586.rpm)
      [root@localhost java]#rpm –ivh jre-1_5_0_9-linux-i586.rpm

      (此时会将JRE装在/usr/java/jre1.5.0_09目录下)

      viii. (设定环境变量,让Linux能找到JRE)
      [root@localhost java]#vi /etc/profile
      (将以下内容加入在档案后面)

1 PATH = $PATH: / usr / java / jre1. 5 .0_09 / bin
2 export JAVA_HOME =/ usr / java / jre1. 5 .0_09
3 export CLASSPATH = $JAVA_HOME / lib:.

      (存盘后,重新启动Linux)

      ix. (测试Java是否安装成功)
      [root@localhost ~]#java –version


    B、 安装Eclipse SDK
      i. (将档案eclipse-SDK-3.2.1-linux-gtk.tar.gz下载到桌面)

      ii. [root@localhost ~]#cd /usr/local

      iii. [root@localhost local]#cp ~Desktop/eclipse-SDK-3.2.1-linux-gtk.tar.gz .    

      iv. (将eclipse-SDK-3.2.1-linux-gtk.tar.gz解压缩)
      [root@localhost local]#tar –zxvf eclipse-SDK-3.2.1-linux-gtk.tar.gz

      v. [root@localhost local]#cd eclipse

      vi. (执行Eclipse)
      [root@localhost eclipse]#./eclipse

      vii. (Select a workspace)
      (将Use this as the default and do not ask again打勾,以后就不会出现这个窗口)


      (第一次执行Eclipse会出现此error,因为没有任何Eclipse设定档,所以无法读取,第二次执行Eclipse就无此错误讯息,按OK继续。)


      (Eclipse主画面)


    C、 安装CDT
      i. (将档案org.eclipse.cdt-3.1.1-linux.x86.tar.gz下载到桌面)

      ii. [root@localhost ~]#cp ~/Desktop/org.eclipse.cdt-3.1.1-linux.x86.tar.gz .

      iii. (将org.eclipse.cdt-3.1.1-linux.x86.tar.gz解压缩)
      [root@localhost ~]#tar –zxvf org.eclipse.cdt-3.1.1-linux.x86.tar.gz
      (档案将解到~/eclipse目录下)

      iv. (安装CDT plugin)
      [root@localhost ~]cp –r eclipse/plugins/. /usr/local/eclipse/plugins/

      v. (启动Eclipse,多了C和C++ Project支持) 
   

C. 如何在Eclipse上开发C/C++程序?
i. 建立Hello Word project
  1. 建立C/C++ project


  2. 选择Managed Make C++ Project(若选择Managed Make C++ Project,Eclipse会自动为我们建立make file;若选择Standard Make C++ Project,则必须自己写make file。)


  3. 输入Project name


  4. 选择Project类型(如执行档或Library,这里选择执行档即可)


  5. 额外的设定


  6. Open Associated Perspective?(选Yes继续)


  7. 建立C++ Source File


8. 输入C++ Source File檔名


  9. 输入C++程序代码


  10. 执行程序(显示在下方的Console区)


ii. 如何在Eclipse CDT中Debug C/C++程序?
1. 在Eclipse中Debug,就如同在一般IDE中Debug一样,只要在程序代码的左方按两下,就可加入breakpoint。


  2. 启动Debug


  3. Debug设定,按Debug开始Debug


  4. 单步执行,显示变量变化


E. 结论
Eclipse为Linux在C/C++开发提供一个完善的IDE环境,事实上,以我用过众多IDE的经验,除了Visual Studio最方便外,Eclipse的好用也直追Visual Studio,并且超越Borland C++ Builder及Dev C++,虽然安装上比较麻烦,但只要依照本文介绍一步一步的设定,就一定可完成Eclipse设定,若想要在Windows平台使用gcc compiler,也建议使用Eclipse + CDT + MinGW的组合。

See Also
[转载] Eclipse + CDT + MinGW 安装方法

Reference
1. 为Linux手动下载和安装Java Runtime Enrironment(JRE)的说明
(http://www.java.com/zh_CN/download/help/5000010500.xml)
2. Eclipse 3.0 CDT on Linux
(http://www.autexier.de/jmau/dev/CDT/cdt.html)

posted @ 2006-11-11 20:56 真 OO无双 阅读(26294) | 评论 (11) | 编辑 收藏
 

2006年10月22日

如何用C++开发ASP.NET?
在Visual Studio .NET 2002刚出来时,我就曾经听过同事说过他用C++写过ASP.NET,不过由于当时才刚刚学C#,还不会C++,所以也没问他是怎么写的,一直到最近开始学C++,发现在Visual Studio 2005可以用C++/CLI开发Windows Form,但却无法开发ASP.NET,实在令人遗憾,在网络上也只在Code Project谈到在Visual Studio .NET 2002下用Managed C++写ASP.NET(ASP.NET with Managed C++),但Managed C++和C++/CLI的语法不太一样,原本的范例无法compile成功,经过一段研究之后,终于找到了用C++/CLI撰写ASP.NET的方式。在这篇文章中,我将一步步的demo如何用C++/CLI开发ASP.NET程序。

 

首先,建立一个新的Web Site,由于Visual Studio 2005在ASP.NET没支持C++,所以建立Web Site时,先随便选一个语言建立。



建立一个Web Form名为HelloWorld.aspx,请不要选择Place code in separate file,这样Visual Studio 2005会将Event Handler放在aspx文件中,可以让aspx.cpp省掉event宣告的程序。



使用Web Form Designer做出以下的介面。



在Page Directive部分,将Language=”C#”删除,加上AutoEventWireup="true" Inherits="HelloWorld",HelloWord为C++的Class名称。也要将<script runat="server"></script>部分删除。

 1<%@ Page AutoEventWireup="true" Inherits="HelloWorld" %>
 2
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4<html xmlns="http://www.w3.org/1999/xhtml">
 5<head runat="server">
 6  <title>Untitled Page</title>
 7</head>
 8<body>
 9  <form id="form1" runat="server">
10    <div>
11      Using C++/CLI in ASP.NET<br />
12      <br />
13      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
14      <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
15  </form>
16</body>
17</html>
18

建立C++ Project,左侧选择CLR,此为.NET platform的Project,右侧选择CLR Empty Project即可,切记不要选择Class Library,这样会多出很多我们不需要的档案,而且最后我们也不会用Visual Studio 2005来compile,会使用Command Prompt的方式compile。



建立HelloWorld.aspx.cpp。




加入C++/CLI程序。C++/CLI对ANSI C++做了些扩充,为了和C++内建的型别与Class做区别,Managed的Class需加上ref modifier,而Managed的Object要加上^。最重要的,IDE支援Intellisense方式写ASP.NET。

 1#using <system.dll>
 2#using <mscorlib.dll>
 3#using <system.web.dll>
 4
 5using namespace System;
 6using namespace System::Web::UI::WebControls;
 7
 8public ref class HelloWorld : public System::Web::UI::Page {
 9protected:
10  Button^ Button1;
11  Label^  Label1;
12
13public:
14  void Button1_Click(Object^ sender, EventArgs^ e) {
15    this->Label1->Text = "Hello World";
16    return;
17  }

18}
;

使用Visual Studio 2005 Command Prompt編譯C++/CLI。

 

使用以下的語法編譯C++/CLI。

1cl /clr HelloWorld.aspx.cpp /link /dll /out:HelloWorld.dll


最后只要将HelloWorld.aspx放到c:\Inetpub\wwwroot\下,HelloWorld.dll放到c:\Inetpub\wwwroot\bin\下,就完成deployment。


结论

很多人说C++无法开发ASP.NET,ANSI C++的确不能,但C++/CLI则可以,事实上,任何.NET下的语言都可以开发ASP.NET,虽然Visual Studio 2005工具不见的支持,但只要透过一些小技巧,你依然可以用妳喜欢的.NET语言开发ASP.NET。


Reference
ASP.NET with Managed C++ , Soliant, The  code project.

posted @ 2006-10-22 12:08 真 OO无双 阅读(2090) | 评论 (1) | 编辑 收藏
 
仅列出标题  
随笔:3 文章:0 评论:20 引用:0
<2025年5月>
日一二三四五六
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿(4)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • [.NET] C++/CLI(2) (rss)
  • [Linux] C++(1) (rss)

随笔档案

  • 2006年11月 (2)
  • 2006年10月 (1)

我的其他博客

  • OOMusou@Java博客
  • OOMusou@博客园 (主站)

搜索

  •  

最新评论

  • 1. re: 如何在Linux使用Eclipse + CDT开发C/C++程序?
  • 呵呵,这是黑客风格的文章
  • --xinqikan
  • 2. re: 如何在Linux使用Eclipse + CDT开发C/C++程序?
  • 你这博客页面风格根本没法看。
  • --www
  • 3. re: 如何在Linux使用Eclipse + CDT开发C/C++程序?
  • 谢谢分享
  • --XIAOHEI
  • 4. re: STL的std::vector和.NET的ArrayList,何者速度较快?
  • 评论内容较长,点击标题查看
  • --Hei
  • 5. re: 如何在Linux使用Eclipse + CDT开发C/C++程序? [未登录]
  • @volnet
    简单地说,就是修改对应警告项目的属性,并修改编译器类型为Linux GCC即可。
  • --volnet

阅读排行榜

  • 1. 如何在Linux使用Eclipse + CDT开发C/C++程序? (26294)
  • 2. STL的std::vector和.NET的ArrayList,何者速度较快? (2757)
  • 3. 如何用C++开发ASP.NET? (2090)

评论排行榜

  • 1. 如何在Linux使用Eclipse + CDT开发C/C++程序? (11)
  • 2. STL的std::vector和.NET的ArrayList,何者速度较快? (8)
  • 3. 如何用C++开发ASP.NET? (1)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 真 OO无双