# Native Code > برنامه نویسی با C > برنامه نویسی با Borland C++‎ Builder >  سرعت کامپایلر C++‎ builder یا visual C++‎ ؟؟؟

## (هیچکس)

سلام.
می خواستم بدونم سرعت زمان اجرای یک برنامه با کامپایلر C++‎builder بالاتره یا visual C++‎
اگه C++‎builder ، چرا اکثر بازی هایی که برای ویندوز می نویسند با visual C++‎ (win32) نوشته میشن ؟؟؟

ممنون.

----------


## anotheruser

سلام.من تاپیکتو موقعی که زده بودی دیدم اما گفتم بزاریم بزرگتر جواب بدن ما یاد بگیریم،اما گویا بزرگترا این ورا سبز نمیشن.تاجایی که من می دونم کدای ترجمه شده vC++‎ خالص تر بوده و کداش سریع تر اجرا میشن.اما سرعت کامپایلر بورلند بیشک بیش تر از کامپایلر vC++‎ میباشد.

----------


## BORHAN TEC

راستش همینجوری نمیشه به این پرسش پاسخ داد. من سعی می کنم که در چند روز آینده تست هایی رو در این رابطه انجام بدم و نتیجه رو در همینجا قرار بدم.  :چشمک:

----------


## Ananas

> اما سرعت کامپایلر بورلند بیشک بیش تر از کامپایلر vC++‎‎ میباشد.


منظورت سرعت کامپایل کردنه یا سرعت اجرای برنامه ی کامپایل شده؟

----------


## بهروز عباسی

> سلام.
> می خواستم بدونم سرعت زمان اجرای یک برنامه با کامپایلر C++‎builder بالاتره یا visual C++‎
> اگه C++‎builder ، چرا اکثر بازی هایی که برای ویندوز می نویسند با visual C++‎ (win32) نوشته میشن ؟؟؟
> 
> ممنون.


 درود به شما دوست عزیز 

اگه نظر منو بخوای(تست نکردم اما از برنامه نویس های زیادی شنیدم) سرعت  visual C++‎‎ (win32) بیشتره.

اینم نمای کلی از این دوزبان+دلفی

 خصوصیات فایلهای اجرایی در کامپایلرهای مختلف اکثر کامپایلرهای سطح بالا ابتدا کدهای نوشته شده را به زبانی سطح پایین ترجمه کرده و سپس آن را کامپایل میکنند.این کار بیشتر به دلیل کاهش پیچیدگی های موجود در زبانهای سطح بالا صورت میگیرد در حقیقت بار کامپایل نهایی را کاهش میدهد. به عنوان مثال زبان MSVC++‎ متکی بر کامپایلر Macro Assembler است حال آنکه زبان C++‎ Builder متکی بر کامپایلر Turbo Assembler است.

MSVC++‎
فایل های اجرایی تولید شده توسط MSVC++‎  بطور کامل به زبان ماشین ترجمه  میشوند و اسامی و برچسب ها و سایر راهنماها در فایل اجرایی حذف شده و قابل  دسترسی نیستند.
معمولاً منابع(Resource) فایلهای اجرایی تولید شده،منابع استاندارد از قبیل Dialog,Bitmapو... هستند
فایل های اجرای تولید شده در VC++‎ از سرعت بالایی برخوردار هستند.به همین  دلیل برای نوشتن درایورهای سخت افزاری و برنامه هایی که نیاز به سرعت بالا  دارند از آن استفاده میشود.


C++‎ Builder,Delphi

فایلهای اجرایی تولید شده توسط این زبانها،تقریباً خصوصیات مشترکی  دارند.ازجمله اینکه اسامی کلاس هاو اشیاء موجود در برنامه در فایل اجرایی  نهایی نیز وجود دارند که این امر باعث خوانایی بیشتر فایلهای اجرایی آنها  شده و در نتیجه مراحل DeCompile شدن آنها به سادگی صورت میگیرد.
فایلهای اجرایی تولید شده نیاز به فایل های جانبی کمتری دارند زیرا اطلاعات  و زیر برنامه های لازم معمولاً بصورت Static به فایل اجرایی پیوند زده  میشود به همین دلیل فایلهای اجرایی تولید شده توسط این زبان
از حجم بالایی برخوردار هستند.
با این وجود به علت اینکه کدها به زبان ماشین ترجمه میشوند،فایلهای کامپایل شده توسط آنها از سرعت نسبتاً خوبی برخوردار هستند.

منبع: کتاب تکنیک های نفوذ به نرم افزار 
تالیف: امید غلامی و بهزاد لاجوردی

----------


## BORHAN TEC

> فایلهای اجرایی تولید شده نیاز به فایل  های جانبی کمتری دارند زیرا اطلاعات  و زیر برنامه های لازم معمولاً بصورت  Static به فایل اجرایی پیوند زده  میشود به همین دلیل فایلهای اجرایی  تولید شده توسط این زبان
> از حجم بالایی برخوردار هستند.


در VC هم می توانیم این حالت را داشته باشیم. به نظر می آید که این کتاب کمی قدیمی باشد و دارای اشکالاتی باشد!

----------


## بهروز عباسی

دوباره درود




> چرا اکثر بازی هایی که برای ویندوز می نویسند با visual C++‎‎ (win32) نوشته میشن ؟؟؟


به نظر من چون اگه در محصولات مایکروسافت تغییری ایجاد بشه حتماً VC هم  با اون سازگار میشه(خیلی سریع) اماCB اینطور نیست و یه پله عقبه
برای این کسانی که مثلاً بازی سازی میکنن اگه با ایجاد تغییر بخوان منتظر سازگار شدن CB باشن پولاشون...

همون طور که دلفی پریزم همیشه از سی شارپ عقب تره و بروز نیست.

----------


## BORHAN TEC

> به نظر من چون اگه در محصولات مایکروسافت تغییری ایجاد بشه حتماً VC هم  با  اون سازگار میشه(خیلی سریع) اماCB اینطور نیست و یه پله عقبه
> برای این کسانی که مثلاً بازی سازی میکنن اگه با ایجاد تغییر بخوان منتظر سازگار شدن CB باشن پولاشون...


با عرض شرمندگی باید بگم که هیچ ربطی نداره. اتفاقاً باید بگم که پیشرفت C++‎‎‎‎‎‎‎‎‎‎‎‎‎ Builder بسیار سریع صورت می گیره! تقریباً هر چیزی که به دلفی اضافه میشه به سرعت به C++‎‎‎‎‎‎‎‎‎‎‎‎‎ Builder هم اضافه میشه. به عنوان یک مثال باید بگویم که شما با C++‎‎‎‎‎‎‎‎‎‎‎‎‎ Builder میتوانید برای OSX هم برنامه بنویسید ولی با VC++‎‎‎‎‎‎‎‎‎‎‎‎‎ نمیشه. از طرفی هم C++‎‎‎‎‎‎‎‎‎‎‎‎‎ Builder از VC++‎‎‎‎‎‎‎‎‎‎‎‎‎ تبعیت نمیکنه که بخواد از اون الگو بگیره. به عنوان مثال C++‎‎‎‎‎‎‎‎‎‎‎‎‎ Builder ابزاری با نام DataSnap داره و از اون برای ساخت برنامه های سازمانی استفاده میشه در صورتی که شما ابزار مشابهی را با این قابلیت ها و راحتی در VC++‎‎‎‎‎‎‎‎‎‎‎‎‎ نخواهید دید. همچنین شما به صورت مستقیم می توانید از کدهای دلفی در C++‎‎‎‎‎‎‎‎‎‎‎‎‎ Builder استفاده کنید.  این فقط یکسری مثال کوچک بود و می توان صدها مورد دیگر رو هم نام برد که توضیح در رابطه همه آنها از حوصله این بحث خارج است.




> همون طور که دلفی پریزم همیشه از سی شارپ عقب تره و بروز نیست.


کی گفته؟ اصلاً هم اینطور نیست. دلفی پریسم دقیقاً قابلیت های C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ رو داره(به غیر از یک مورد که در این زمان تقریباً دیگه بهش نیازی نیست) و یکسری امکانات اضافه تر هم داره! 
به عنوان مثال:
- با دلفی پریسم حتی می توانید برنامه های مبتنی بر جاوا هم بنویسید برای کسب اطلاعات بیشتر می توانید عبارت Cooper را سرچ کنید.
- توانایی استفاده از کدهای C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ در دلفی پریسم
- قابلیت Fix-It و Spell checking به صورت بسیار هوشمند
- برنامه نویسی موازی که البته نسخه های جدید تر C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ هم دارند.
- دارا بودن یک ابزار Oxfuscator
- و ... .

همچنین باید بگویم که کامپایلر Delphi Prism از کامپایلر C#‎‎‎‎‎‎‎‎‎‎‎‎‎ کدهای نهایی بهینه تری را تولید می کند. شاید باور نکنید، ولی من طی تست هایی که انجام داده ام در این مورد به این *نتیجه قطعی* دست یافته ام.  :لبخند: 
در هر حال میتوان گفت که Delphi Prism اصلاً از C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ عقبتر نیست!  :چشمک:  اون که همیشه از دنیای دات نت عقب می افتاد Delphi.Net بود و نه Delphi Prism!
این را هم باید بگویم که Delphi.Net مبتنی بر راه حل (Solution) بود که کلاً منسوخ شد ولی Delphi Prism مبتنی بر تکنولوژِی است و به خاطر همین سیاست از تکنولوژی های روز دات نت به هیچ عنوان عقب نمی افتد بلکه در برخی از موارد حتی جلوتر از آن حرکت می کند.

*دوست عزیزم، خواهش می کنم که اگر در رابطه با موضوعی اطلاعات کافی ندارید چیزی نگویید چون این کار باعث گمراهی بسیاری از برنامه نویسان مبتدی خواهد شد.*  :خجالت: 




> کدای ترجمه شده vC++‎‎‎‎‎‎ خالص تر بوده و کداش سریع تر اجرا میشن.


بعید میدونم که همیشه خالص تر بودن کدها باعث افزایش سرعت اجرا بشه. به عنوان یک مثال قابل فهم جستجوی خطی و باینری را در مورد یک آرایه مرتب شده در نظر بگیرید. ار لحاظ کلی برنامه ای که از جستجوی خطی استفاده می کند کم حجم تر است و کدهای نهایی خالص تری خواهد داشت ولی آیا می توان گفت که عملیات جستجو را نسبت به روش باینری سریع تر انجام میدهد؟!!! :متفکر: 
در حالت کلی کامپایلر های مختلف هم سعی می کنند که کدهای بهینه تری را تولید کنند و این دلیل نمیشه که اگه کامپایلری کد های خالص تری تولید کنه برنامه تولید شده سریعتر اجرا بشه! به نظر من خالص تر بودن کدها با سرعت اجرا ارتباط بسیار محکمی نداره و به عبارتی در کنار خالص بودن کدهای نهایی پارامتر بهینه سازی توسط کامپایلر هم بسیار مهم  و حائز اهمیت است.

و اما، در مورد پست 3 هم به محض اینکه یه فرصت چند ساعته پیدا کنم آزمایشاتی را انجام خواهم داد و نتایجش را قرار خواهم داد.

یا حق...

----------


## بهروز عباسی

> همچنین باید بگویم که کامپایلر Delphi Prism از کامپایلر C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎  کدهای نهایی بهینه تری را تولید می کند. شاید باور نکنید، ولی من طی تست  هایی که انجام داده ام در این مورد به این *نتیجه قطعی* دست یافته ام. 
> در هر حال میتوان گفت که Delphi Prism اصلاً از C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ عقبتر نیست!  اون که همیشه از دنیای دات نت عقب می افتاد Delphi.Net بود و نه Delphi Prism!
> این را هم باید بگویم که Delphi.Net مبتنی بر راه حل (Solution) بود که  کلاً منسوخ شد ولی Delphi Prism مبتنی بر تکنولوژِی است و به خاطر همین  سیاست از تکنولوژی های روز دات نت به هیچ عنوان عقب نمی افتد بلکه در برخی  از موارد حتی جلوتر از آن حرکت می کند.


اینو نمیدونستم شرمنده به بیراهه کشیدم
بابت این اطلاعات بسیار ممنون

----------


## AbbasVB

سلام دوستان بااین همه؟



> چرا اکثر بازی هایی که برای ویندوز می نویسند با visual C++‎‎ (win32) نوشته میشن ؟؟؟


اگه با C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎ Builderمیشه چرا این کارو نمیکنن اگه شده درصورت امکان اون برنامه رو ذکرکنید.
متشکر

----------


## بهروز عباسی

فکر نکنم منبعی باشه که بشه فهمید کدوم برنامه با چی نوشته شده باید خودت تست کنی
برای مثال برنامه AVG PC Tuneup 2011 با سی بیلدر نوشته شده که همراه آنتی ویروس avg عرضه میشه
شما با برنامه PEID میتونی نرم افزارهارو تست کنی تا از زبان برنامه نویسی شان مطلع بشی

----------


## BORHAN TEC

> اگه با C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ Builderمیشه چرا این کارو نمیکنن اگه شده درصورت امکان اون برنامه رو ذکرکنید.


بیشتر شرکتها علاقه ندارند که بگویند نرم افزاران را با چه چیزی نوشته اند ولی باید بگویم که امروزه نرم افزار های بسیار معروفی را با C++‎ Builder نوشته اند که در میان آنها هم میتوان نرم افزارهای مربوط به کارهای گرافیکی را هم مشاهده کرد که لیست مربوط به آنها را می توان در سایت Embarcadero مشاهده کرد.

----------


## Ananas

بالا خره سرعت تو کدوم بیشتره؟ (اگه به برنامه فرق میکنه مشخصا برای کارای گرافیکی و بازی و دایرکت ایکس یا اپن جی ال منظورم هست)
من یکی دوتا تست کوچیک انجام دادم سرعت دلفی بیشتر از این دوتاست و سرعت vs از C++‎builder کمتره.یعنی هرچی نزدیکتر به دلفی بوده سرعتش بیشتر شده البته اختلاف خیلی جزئی مثلا 1.6 تا 1.8 .من ضرب ماتریس ها رو امتحان کردم. ولی هنوز نمایش تصویر و تعداد فریم بر ثانیه رو تست نکردم. اگه کسی چیزی امتحان کرده لطفا بگه.

----------


## Ananas

خوب کسی جواب نمیده؟
این یه تسته که تو C++‎‎builer نوشتم و برای vs یکمی تفاوت داره در حد یکی دو خط مثلا برای "MHD" یه L به اولش اضافه کردم و یا تابع pow10 رو به شکل pow(10, ...)o نوشتم چون ارور میداد وگرنه بقیش مثل هم هست. سرعتشون تقریبا یکیه نمیشه گفت کدوم سریع تره. برنامه با Direct3D9 هست و یک قوری زرد با بکگراند آبی رو نمایش میده که تو مرکز مختصات داره دور خودش می چرخه. از سیستم نورافشانی دایرکت تریدی استفاده شده.
به هر حال وقتی برنامه اجرا شد پنجره تمام صفحه میشه بعد با alt + f4 برنامه رو ببندید، پنجره برنامه بسته میشه یم پنجره پیغام میاد که یک لیستی از فریم بر ثانیه که تو 25 فریم آخر ذخیره شده رو نمایش میده که اولین عدد از تقسیم کل فریم ها بر زمان کل نمایش بدست میاد و بقیشون (24 تای بعد) هم برای هر فریم جداگانه حساب شده. عدد اول تقریبا به شکل میانگین هست.
کد تو C++‎‎builder:

/*****************
*                *
*    MHD_1391    *
*                *
*****************/

#include <windows.h>

#pragma hdrstop

#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

#include <tchar.h>

IDirect3D9            *xd3d;
IDirect3DDevice9      *xdev;
D3DCAPS9               xcaps;
D3DVIEWPORT9           xvp;
D3DPRESENT_PARAMETERS  xpp;
D3DLIGHT9              xlight;
D3DMATERIAL9           xmaterial;
ID3DXMesh             *teaput;
HWND                   DXhwnd = NULL;
//------------------------------------------------------------------------------
#define FPS_LIST_COUNT 25
double CurrentTime, StartTime;
int FPS_Index = -1;
double FPSs[FPS_LIST_COUNT];
int FrameCount = 0;

double GetNow()
{
    LARGE_INTEGER lic, lif;
    QueryPerformanceCounter(&lic);
    QueryPerformanceFrequency(&lif);
    return (double)lic.QuadPart / (double)lif.QuadPart;
}

void UpdateFPS()
{
    FPS_Index++;
    if (FPS_Index >= FPS_LIST_COUNT)
    {
        FPS_Index = 0;
    }
    FPSs[FPS_Index] = 1.0L / (GetNow() - CurrentTime);
}

char * DoubleToStr(const double d)
{
    char * s = new char[20];
    if (d == 0.0L)
    {
        for (int i = 0; i < 20; i++) {
            s[i] = '0';
        }
        s[19] = NULL;
        return s;
    }
    int exponent = (int)log10(fabsl(d));
    double num = fabsl(d) / pow10l((double)exponent);
    if (num >= 1.0L)
    {
        num /= 10.0L;
    }
    else
        exponent--;
    num += 0.0000000000001L;
    int x;
    int i = 0;
    if (d < 0.0L)
    {
        s[0] = '-';
    }
    else
    {
        s[0] = '+';
    }
    s[2] = '.';
    while (i < 10)
    {
        i++;
        if (i == 2)
        {
            i++;
        }
        num *= 10.0L;
        x = num;
        s[i] = '0' + x;
        num = num - x;
    }
    if (exponent != 0)
    {
        i++;
        s[i] = 'e';
        if (exponent < 0)
        {
            i++;
            s[i] = '-';
            exponent = abs(exponent);
        }
        int expon_10 = log10(exponent);
        expon_10 = pow10(expon_10);
        while (expon_10 > 0)
        {
            i++;
            s[i] = '0' + (exponent / expon_10);
            expon_10 /= 10;
        }
    }
    s[i + 1] = NULL;
    return s;
}

void straddstr(char **c1, const char *c2)
{
    int i = strlen(*c1),
        j = strlen(c2);

    char *c3 = (char *)malloc(i + j + 1);
    memcpy(c3, *c1, i);
    memcpy(c3 + i, c2, j);
    c3[i + j] = NULL;
    *c1 = c3;
}

void MessageFPS()
{
    FPSs[0] = (double)FrameCount / (GetNow() - StartTime);
    char nextline[3] = {char(13), char(10), 0};
    char *s = "";
    char *num;
    for (int i = 0; i < FPS_LIST_COUNT; i++)
    {
        num = DoubleToStr(FPSs[i]);
        straddstr(&num, nextline);
        if (i == 0)
        {
            straddstr(&num, nextline);
        }
        straddstr(&s, num);
    }

    MessageBox(0, s, "MHD_1391", MB_OK);
}

//------------------------------------------------------------------------------
tagPOINT GetScreenSize()
{
    tagPOINT p;
    tagRECT r;
    GetWindowRect(GetDesktopWindow(), &r);
    p.x = r.right;
    p.y = r.bottom;
    return p;
}
tagPOINT desktop_size = GetScreenSize();

HRESULT DXCreateDevice()
{
    xd3d = Direct3DCreate9(D3D_SDK_VERSION);
    xd3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &xcaps);
    DWORD vp;
    if (xcaps.Caps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    {
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    }
    else
    {
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    }
    xpp.BackBufferWidth = desktop_size.x;
    xpp.BackBufferHeight = desktop_size.y;
    xpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    xpp.BackBufferCount = 0;
    xpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    xpp.MultiSampleQuality = 0;
    xpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    xpp.hDeviceWindow = DXhwnd;
    xpp.Windowed = true;
    xpp.EnableAutoDepthStencil = true;
    xpp.AutoDepthStencilFormat = D3DFMT_D24S8;
    xpp.Flags = 0;
    xpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    xpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    return xd3d->CreateDevice(
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,
        DXhwnd,
        D3DCREATE_FPU_PRESERVE | vp,
        &xpp,
        &xdev
    );
}

HRESULT DXSetup()
{
    StartTime = GetNow();
    HRESULT out = D3DXCreateTeapot(xdev, &teaput, NULL);
    if (FAILED(out)) return out;
    //----------------------
    xvp.X = 0;
    xvp.Y = 0;
    xvp.Width = desktop_size.x;
    xvp.Height = desktop_size.y;
    xvp.MinZ = 0.0f;
    xvp.MaxZ = 1.0f;
    xdev->SetViewport(&xvp);
    //----------------------
    xlight.Type         = D3DLIGHT_POINT;
    xlight.Diffuse      = D3DXCOLOR(1.0, 1.0, 1.0f, 1.0f);
    xlight.Specular     = xlight.Diffuse;
    xlight.Ambient      = xlight.Diffuse;
    xlight.Range        = 1000.0f;
    xlight.Position     = D3DXVECTOR3(10.0f, 10.0f, 10.0f);
    xlight.Attenuation0 = 1.0f;
    xlight.Attenuation1 = 0.0f;
    xlight.Attenuation2 = 0.0f;
    xdev->SetLight(0, &xlight);
    xdev->LightEnable(0, true);
    //----------------------
    xmaterial.Diffuse  = D3DXCOLOR(1.0, 1.0, 0.0f, 1.0f);
    xmaterial.Ambient  = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
    xmaterial.Specular = D3DXCOLOR(1.0, 1.0, 1.0f, 1.0f);
    xmaterial.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
    xmaterial.Power    = 10.0f;
    xdev->SetMaterial(&xmaterial);
    //----------------------
    xdev->SetRenderState(D3DRS_ZENABLE, true);
    xdev->SetRenderState(D3DRS_LIGHTING, true);
    xdev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
    xdev->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
    xdev->SetRenderState(D3DRS_ZWRITEENABLE, true);
    xdev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    return 0;
}

void DXDisplay()
{
    FrameCount++;
    double now_ = GetNow();
    xdev->Clear(
        0,
        NULL,
        D3DCLEAR_TARGET |
        D3DCLEAR_STENCIL |
        D3DCLEAR_ZBUFFER,
        0xff0000ff,
        1.0,
        0);
//------------------------------------------------------------------------------
    xdev->BeginScene();
    //-------------------------------------------
    D3DXMATRIX m, rx, rz;
    D3DXMatrixIdentity(&m);
    xdev->SetTransform(D3DTS_WORLD, &m);
    //-------------------------------------------
    D3DXMatrixPerspectiveFovRH(
        &m,
        M_PI / 4.0f,
        (float)xvp.Width / (float)xvp.Height,
        1.0f,
        1000.0f
    );
    xdev->SetTransform(D3DTS_PROJECTION, &m);
    //-------------------------------------------
    D3DXMatrixRotationX(&rx, M_PI / 4.0f);
    D3DXMatrixRotationZ(&rz, M_PI / 4.0f);
    m = rx * rz;
    D3DXMatrixTranslation(&rx, 0.0f, 0.0f, 5.0f);
    m = rx * m;
    D3DXMatrixInverse(&m, NULL, &m);
    xdev->SetTransform(D3DTS_VIEW, &m);
    //-------------------------------------------
    D3DXMatrixRotationX(&rx, M_PI / 2.0f);
    D3DXMatrixRotationZ(&rz, 10.0f * now_ / M_PI);
    m = rx * rz;
    xdev->SetTransform(D3DTS_WORLD, &m);
    teaput->DrawSubset(0);
    xdev->EndScene();
//------------------------------------------------------------------------------
    xdev->Present(NULL, NULL, NULL, NULL);
}

//------------------------------------------------------------------------------

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }
}

void WindowsFunctions()
{
    //------------------------------------------------------------------------------
    WNDCLASSEX wcx;
    wcx.cbSize        = sizeof(WNDCLASSEX);
    wcx.style         = 0;
    wcx.lpfnWndProc   = WndProc;
    wcx.cbClsExtra    = 0;
    wcx.cbWndExtra    = 0;
    wcx.hInstance     = GetModuleHandle(0);
    wcx.hIcon         = LoadIcon(0,IDI_APPLICATION);
    wcx.hCursor       = LoadCursor(0,IDC_ARROW);
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOWFRAME);
    wcx.lpszMenuName  = 0;
    wcx.lpszClassName = "classname";
    wcx.hIconSm       = LoadIcon(0,IDI_APPLICATION);
    RegisterClassEx(&wcx);
//------------------------------------------------------------------------------
    tagRECT desktop_rect;
    GetWindowRect(GetDesktopWindow(), &desktop_rect);
    HWND hwnd = CreateWindowEx
    (
        0                   ,// dwExStyle
        "classname"         ,// lpClassName
        "title"             ,// lpWindowName
        WS_POPUP            ,// dwStyle
        0                   ,// x
        0                   ,// y
        desktop_rect.right  ,//CW_USEDEFAULT       ,// nWidth
        desktop_rect.bottom ,// nHeight
        0                   ,// hWndParent
        0                   ,// hMenu
        0                   ,// hInstance
        0                   // lpParam
    );
    ShowWindow(hwnd, SW_SHOWMAXIMIZED);
    UpdateWindow(hwnd);
    DXhwnd = hwnd;
}

WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    DoubleToStr(100.0);
    WindowsFunctions();
    if FAILED(DXCreateDevice())
        MessageBox(NULL, "FAILED CreateDevice!", "MHD_1391", MB_OK);
    if FAILED(DXSetup())
        MessageBox(NULL, "FAILED Setup!", "MHD_1391", MB_OK);
//------------------------------------------------------------------------------
    MSG Msg;
    while (true)
    {
        if (PeekMessage(&Msg, 0, 0, 0, PM_REMOVE) > 0)
        {
            if (Msg.message == WM_QUIT) {
                break;
            }
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        CurrentTime = GetNow();
        DXDisplay();
        UpdateFPS();
    }
    teaput->Release();
    xdev->Release();
    xd3d->Release();
    MessageFPS();
//------------------------------------------------------------------------------
    return 0;
}


کد برای VisualStudio:

/*****************
*                *
*    MHD_1391    *
*                *
*****************/

#define _USE_MATH_DEFINES
#include <math.h>
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma hdrstop

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

#include <tchar.h>

IDirect3D9            *xd3d;
IDirect3DDevice9      *xdev;
D3DCAPS9               xcaps;
D3DVIEWPORT9           xvp;
D3DPRESENT_PARAMETERS  xpp;
D3DLIGHT9              xlight;
D3DMATERIAL9           xmaterial;
ID3DXMesh             *teaput;
HWND                   DXhwnd = NULL;
//------------------------------------------------------------------------------
#define FPS_LIST_COUNT 25
double CurrentTime, StartTime;
int FPS_Index = -1;
double FPSs[FPS_LIST_COUNT];
int FrameCount = 0;

double GetNow()
{
    LARGE_INTEGER lic, lif;
    QueryPerformanceCounter(&lic);
    QueryPerformanceFrequency(&lif);
    return (double)lic.QuadPart / (double)lif.QuadPart;
}

void UpdateFPS()
{
    FPS_Index++;
    if (FPS_Index >= FPS_LIST_COUNT)
    {
        FPS_Index = 0;
    }
    FPSs[FPS_Index] = 1.0L / (GetNow() - CurrentTime);
}

char * DoubleToStr(const double d)
{
    char * s = new char[20];
    if (d == 0.0L)
    {
        for (int i = 0; i < 20; i++) {
            s[i] = '0';
        }
        s[19] = NULL;
        return s;
    }
    int exponent = (int)log10(fabsl(d));
    double num = fabsl(d) / pow(10, (double)exponent);
    if (num >= 1.0L)
    {
        num /= 10.0L;
    }
    else
        exponent--;
    num += 0.0000000000001L;
    int x;
    int i = 0;
    if (d < 0.0L)
    {
        s[0] = '-';
    }
    else
    {
        s[0] = '+';
    }
    s[2] = '.';
    while (i < 10)
    {
        i++;
        if (i == 2)
        {
            i++;
        }
        num *= 10.0L;
        x = num;
        s[i] = '0' + x;
        num = num - x;
    }
    if (exponent != 0)
    {
        i++;
        s[i] = 'e';
        if (exponent < 0)
        {
            i++;
            s[i] = '-';
            exponent = abs(exponent);
        }
        int expon_10 = log10((double)exponent);
        expon_10 = pow(10, (double)expon_10);
        while (expon_10 > 0)
        {
            i++;
            s[i] = '0' + (exponent / expon_10);
            expon_10 /= 10;
        }
    }
    s[i + 1] = NULL;
    return s;
}

void straddstr(char **c1, const char *c2)
{
    int i = strlen(*c1),
        j = strlen(c2);

    char *c3 = (char *)malloc(i + j + 1);
    memcpy(c3, *c1, i);
    memcpy(c3 + i, c2, j);
    c3[i + j] = NULL;
    *c1 = c3;
}

void MessageFPS()
{
    FPSs[0] = (double)FrameCount / (GetNow() - StartTime);
    char nextline[3] = {char(13), char(10), 0};
    char *s = "";
    char *num;
    for (int i = 0; i < FPS_LIST_COUNT; i++)
    {
        num = DoubleToStr(FPSs[i]);
        straddstr(&num, nextline);
        if (i == 0)
        {
            straddstr(&num, nextline);
        }
        straddstr(&s, num);
    }

    MessageBoxA(0, s, "MHD_1391", MB_OK);
}

//------------------------------------------------------------------------------
tagPOINT GetScreenSize()
{
    tagPOINT p;
    tagRECT r;
    GetWindowRect(GetDesktopWindow(), &r);
    p.x = r.right;
    p.y = r.bottom;
    return p;
}
tagPOINT desktop_size = GetScreenSize();

HRESULT DXCreateDevice()
{
    xd3d = Direct3DCreate9(D3D_SDK_VERSION);
    xd3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &xcaps);
    DWORD vp;
    if (xcaps.Caps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    {
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    }
    else
    {
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    }
    xpp.BackBufferWidth = desktop_size.x;
    xpp.BackBufferHeight = desktop_size.y;
    xpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    xpp.BackBufferCount = 0;
    xpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    xpp.MultiSampleQuality = 0;
    xpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    xpp.hDeviceWindow = DXhwnd;
    xpp.Windowed = true;
    xpp.EnableAutoDepthStencil = true;
    xpp.AutoDepthStencilFormat = D3DFMT_D24S8;
    xpp.Flags = 0;
    xpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    xpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    return xd3d->CreateDevice(
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,
        DXhwnd,
        D3DCREATE_FPU_PRESERVE | vp,
        &xpp,
        &xdev
    );
}

HRESULT DXSetup()
{
    StartTime = GetNow();
    HRESULT out = D3DXCreateTeapot(xdev, &teaput, NULL);
    if (FAILED(out)) return out;
    //----------------------
    xvp.X = 0;
    xvp.Y = 0;
    xvp.Width = desktop_size.x;
    xvp.Height = desktop_size.y;
    xvp.MinZ = 0.0f;
    xvp.MaxZ = 1.0f;
    xdev->SetViewport(&xvp);
    //----------------------
    xlight.Type         = D3DLIGHT_POINT;
    xlight.Diffuse      = D3DXCOLOR(1.0, 1.0, 1.0f, 1.0f);
    xlight.Specular     = xlight.Diffuse;
    xlight.Ambient      = xlight.Diffuse;
    xlight.Range        = 1000.0f;
    xlight.Position     = D3DXVECTOR3(10.0f, 10.0f, 10.0f);
    xlight.Attenuation0 = 1.0f;
    xlight.Attenuation1 = 0.0f;
    xlight.Attenuation2 = 0.0f;
    xdev->SetLight(0, &xlight);
    xdev->LightEnable(0, true);
    //----------------------
    xmaterial.Diffuse  = D3DXCOLOR(1.0, 1.0, 0.0f, 1.0f);
    xmaterial.Ambient  = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
    xmaterial.Specular = D3DXCOLOR(1.0, 1.0, 1.0f, 1.0f);
    xmaterial.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
    xmaterial.Power    = 10.0f;
    xdev->SetMaterial(&xmaterial);
    //----------------------
    xdev->SetRenderState(D3DRS_ZENABLE, true);
    xdev->SetRenderState(D3DRS_LIGHTING, true);
    xdev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
    xdev->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
    xdev->SetRenderState(D3DRS_ZWRITEENABLE, true);
    xdev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
}

void DXDisplay()
{
    FrameCount++;
    double now_ = GetNow();
    xdev->Clear(
        0,
        NULL,
        D3DCLEAR_TARGET |
        D3DCLEAR_STENCIL |
        D3DCLEAR_ZBUFFER,
        0xff0000ff,
        1.0,
        0);
//------------------------------------------------------------------------------
    xdev->BeginScene();
    //-------------------------------------------
    D3DXMATRIX m, rx, rz;
    D3DXMatrixIdentity(&m);
    xdev->SetTransform(D3DTS_WORLD, &m);
    //-------------------------------------------
    D3DXMatrixPerspectiveFovRH(
        &m,
        //M_PI
        3.14159265358979f / 4.0f,
        (float)xvp.Width / (float)xvp.Height,
        1.0f,
        1000.0f
    );
    xdev->SetTransform(D3DTS_PROJECTION, &m);
    //-------------------------------------------
    D3DXMatrixRotationX(&rx, M_PI / 4.0f);
    D3DXMatrixRotationZ(&rz, M_PI / 4.0f);
    m = rx * rz;
    D3DXMatrixTranslation(&rx, 0.0f, 0.0f, 5.0f);
    m = rx * m;
    D3DXMatrixInverse(&m, NULL, &m);
    xdev->SetTransform(D3DTS_VIEW, &m);
    //-------------------------------------------
    D3DXMatrixRotationX(&rx, M_PI / 2.0f);
    D3DXMatrixRotationZ(&rz, 10.0f * now_ / M_PI);
    m = rx * rz;
    xdev->SetTransform(D3DTS_WORLD, &m);
    teaput->DrawSubset(0);
    xdev->EndScene();
//------------------------------------------------------------------------------
    xdev->Present(NULL, NULL, NULL, NULL);
}

//------------------------------------------------------------------------------

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }
}

void WindowsFunctions()
{
    //------------------------------------------------------------------------------
    WNDCLASSEX wcx;
    wcx.cbSize        = sizeof(WNDCLASSEX);
    wcx.style         = 0;
    wcx.lpfnWndProc   = WndProc;
    wcx.cbClsExtra    = 0;
    wcx.cbWndExtra    = 0;
    wcx.hInstance     = GetModuleHandle(0);
    wcx.hIcon         = LoadIcon(0,IDI_APPLICATION);
    wcx.hCursor       = LoadCursor(0,IDC_ARROW);
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOWFRAME);
    wcx.lpszMenuName  = 0;
    wcx.lpszClassName = L"classname";
    wcx.hIconSm       = LoadIcon(0,IDI_APPLICATION);
    RegisterClassEx(&wcx);
//------------------------------------------------------------------------------
    tagRECT desktop_rect;
    GetWindowRect(GetDesktopWindow(), &desktop_rect);
    HWND hwnd = CreateWindowEx
    (
        0                   ,// dwExStyle
        L"classname"         ,// lpClassName
        L"title"             ,// lpWindowName
        WS_POPUP            ,// dwStyle
        0                   ,// x
        0                   ,// y
        desktop_rect.right  ,//CW_USEDEFAULT       ,// nWidth
        desktop_rect.bottom ,// nHeight
        0                   ,// hWndParent
        0                   ,// hMenu
        0                   ,// hInstance
        0                   // lpParam
    );
    ShowWindow(hwnd, SW_SHOWMAXIMIZED);
    UpdateWindow(hwnd);
    DXhwnd = hwnd;
}

//WINAPI
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    DoubleToStr(100.0);
    WindowsFunctions();
    if FAILED(DXCreateDevice())
        MessageBox(NULL, L"FAILED CreateDevice!", L"MHD_1391", MB_OK);
    if FAILED(DXSetup())
        MessageBox(NULL, L"FAILED Setup!", L"MHD_1391", MB_OK);
//------------------------------------------------------------------------------
    MSG Msg;
    while (true)
    {
        if (PeekMessage(&Msg, 0, 0, 0, PM_REMOVE) > 0)
        {
            if (Msg.message == WM_QUIT) {
                break;
            }
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        CurrentTime = GetNow();
        DXDisplay();
        UpdateFPS();
    }
    teaput->Release();
    xdev->Release();
    xd3d->Release();
    MessageFPS();
//------------------------------------------------------------------------------
    return 0;
}


تو سیستم من تقریبا 1140 فریم بر ثانیه نمایش میدن هم با vs هم C++‎builder.

----------


## Hossenbor

ولی ویژال سی پلاس پلاس تو رابط کاربریش خیلی ضعیفه یا من طرز کار باهاش بلد نیستم یک پسورد جنریتور ساختم بهش گفتم صد هزار پسورد بسازه تو کمتر از یک ثانیه ساخت اما وقتی میخواست به ادیت کنترل اضافه شون کنه 12 ثانیه طول کشید طول پسوردها هم 64 بود و اینو با یک برنامه که حجمش زیاد بود به احتمال زیاد یا با دلفی بود یا سی پلاس پلاس بویلدر ام اف سی که نبود مدت زمانی که طول کشید 4 تا 5 ثانیه بود البته من تقلب کردم ظرفیت بافرمو زیاد کردم و بدون رابط کاربری برنامه من دو میلیون رمز رو با طول 64 توی 5 الی 6 ثانیه توی یک فایل بهم تحویل میداد البته این نکته رو هم بگم تا نامردی نشه من از خط فرمان استفاده کردم اون از رابط کاربری و پروجرس بار و دوتا لیبل که کارشو نشون میداد

----------


## #target

C++‎‎Builder برنامه هایی که باهاش مینویسین از کلاس های VCL استفاده میکنین و احتمالا  سرعت کمتر میشه (ولی خوب نامحسوسه)! اما اینکه بعضی وقتها میبینی مثلا با Win32 برنامه گرافیکی کند تره این احتمالا دلیل اینه که شما کد استانداردی ننوشتید . 
در C++‎‎Builder همه اشیا برای طراحی در اختیار شماست و فقط شما نقاشی میکنید (برای طراحی محیط) اما با Win32 شما خودتان قدم به قدم کار و انجام میدین . اگر همون کد Win32 رو با کامپایلر بورلند کامپایل کردین سریعتر شد اونوقت !

----------


## Ananas

> C++‎‎‎‎Builder برنامه هایی که باهاش مینویسین از کلاس های VCL استفاده میکنین و احتمالا  سرعت کمتر میشه (ولی خوب نامحسوسه)! اما اینکه بعضی وقتها میبینی مثلا با Win32 برنامه گرافیکی کند تره این احتمالا دلیل اینه که شما کد استانداردی ننوشتید . 
> در C++‎‎‎‎Builder همه اشیا برای طراحی در اختیار شماست و فقط شما نقاشی میکنید (برای طراحی محیط) اما با Win32 شما خودتان قدم به قدم کار و انجام میدین . اگر همون کد Win32 رو با کامپایلر بورلند کامپایل کردین سریعتر شد اونوقت !


به نظرم (مگه کی هستی که نظر میدی؟ :لبخند گشاده!: ) مقایسه با کد های مشابه درستر هست و من به شخصه بیشتر مایلم بدونم که اگه برنامه ای رو با C++‎‎‎builder کامپایل کنیم که بشه همون کد رو با کمی تغییر با VisualStudio کامپایل کرد (مثلا نخوایم خیلی از امکانات vcl استفاده کنیم) ، اونوقت سرعت اجرای برنامه تو کدوم بیشتر میشه؟ ضمن اینکه ما تو C++‎‎Builder هم می تونیم برنامه رو به شکل Win32 و بدون استفاده از VCL بنویسیم، همون طور که شما هم فرمودید اونوقت مایلیم که بدونیم سرعت تو کدوم بیشتره. مثل کدی که بنده نوشتم.
کدی که بنده تو پستای قبل نوشتم بیشتر توابع Direct3D رو فراخونی می کرد که اون هم بیشتر تو dll های دایرکت تری دی هستن و در واقع کدهای دستی که ما نوشتیم خیلی دخیل نیستن که سرعت دو تا کامپایلر رو بخوایم مقایسه کنیم. ولی با این حال تقریبا در مورد استفاده از Direct3D من به جوابم رسیدم و نتیجه گرفتم که سرعتشون تقریبا یکی هست هر چند دلیل اصلی اون شاید استفاده ی دو تا کامپایلر از  dll های مشترک باشه. به همین خاطر که تفاوت سرعت وجود نداره یا حداقل کمه ، من برای اینکه بتونم در صورت لزوم از vcl هم استفاده کنم هر چند مختصر ولی بی دردسر، تصمیم گرفتم برنامه هام رو با C++‎‎‎Builder بنویسم.
بازم اگه کسی برنامه ی مقایسه نوشته لطفا اضافه کنه. ممنون.

----------


## #target

اینطوری نمیشه ی برنامه نوشتو بعد بیای با ی ساعت زمان بگیری کدوم سریعتره 
معمولا باید کدهای ترجمه شده به زمان ماشین دو تابع رو دید 
تا جایی که من بررسی کردم ویژوال استودیو هوشمندتر عمل میکنه . من ی نمونه کدو با هر دو کامپایلر کامپیل کردم و کد اسمبلی رو دیدم که ببینم چطوره 
هر دو کد در حالت Release بدون تغییر در تنظیمات انجام شده
تابع زیر 

int y()
{
	int i;
	for (i = 0; i < 10; i++)
		i += 1;
	printf("%d" , i);
	return 0;
}

کامپایلر C++‎‎‎‎Builder 2009 کدو به شکل زیر درآورده 

XOR EAX,EAX
X1 : INC EAX
INC EAX
CMP EAX,0A
JL X1
PUSH EAX
PUSH 004020A8    //; |format = "%d"
CALL <JMP.&CC3290._printf>
ADD ESP,8
XOR EAX,EAX
RETN

اما ویژوال استودیو 2010 هوشمندانه تر عمل کرده . در کدی که من نوشتم حلقه در نهایت مقدار i رو ده میکنه ویژوال استودیو در کد کامپایل شده حلقه رو اصلا اجرا نمیکنه و مستقیما مقدار ده رو برا پرینت میفرسته

PUSH 0A             //; 0A = 10
PUSH 004020F4  //; |format = "%d"
CALL [MSVCR100.printf]
ADD ESP,8
XOR EAX,EAX
RETN

البته با این وضع باز هم نمیشه تصمیم دقیقی گرفت

----------


## Ananas

ممنون از کدی که نوشتی و مقایه کردی.



> اینطوری نمیشه ی برنامه نوشتو بعد بیای با ی ساعت زمان بگیری کدوم سریعتره 
> معمولا باید کدهای ترجمه شده به زمان ماشین دو تابع رو دید


چرا نمیشه؟ راهش همینه:
1 -  اختلاف زمانی بین شروع و پایان کار.
2 - تعداد دفعات انجام کار در زمان مشخص.
هر دو تا میتونه تو یک دوره ی زمانی متوسط (در حد 5 ثانیه) اختلاف سرعت رو به خوبی مشخص کنه.
سرعت چیه؟
از نظر فیزیکی جابجایی تقسیم بر زمان. در اینجا به طریق مشابه تعداد فریم تقسیم بر زمان. فریم های بیشتر در زمان کمتر. چیزی که تو برنامه هایی مثل بازی خیلی مهمه و به نمایش روان و نرم کمک میکنه و هم اینکه اجازه میده تا ما جای تعداد بیشتری از فریم ها رو بدیم به محاسبات لازم برای امور دیگه. یعنی اگه میتونیم 100 فریم بر ثانیه نمایش بدیم، میایم 30 فریم نمایش میدیم و زمان اضافی این بین رو صرف کارای دیگه میکنیم.
اگه اختلاف زمانی اینقدر کوچیک هست که من با دیدن اعداد زمان نتونم تشخیص بدم مطمئنا تو نمایش هم تاثیر خاصی نداره و با اطمینان کامل میشه ازش صرف نظر کرد.

----------


## #target

اون درست . اما شما در ویندوز که اجرا میکنید کل سیستم در اختیار شما نیست . در نتیجه ممکنه هر بار ی نتیجه بگیرید (البته اونقدر تفاوت نباید محسوس باشه )
برای گرفتن زمان با دقت بالاتر میتونید از تابع QueryPerformanceCounter برای گرفتن زمان اجرای کد با دقت بالا (میکروثانیه باید باشه) استفاده کنید




> اگه اختلاف زمانی اینقدر کوچیک هست که من با دیدن اعداد زمان نتونم تشخیص بدم مطمئنا تو نمایش هم تاثیر خاصی نداره و با اطمینان کامل میشه ازش صرف نظر کرد.


بله درسته . تغییر سرعت ها برای کاربر محسوس نیست و این تفاوت ها هم شاید در حد کمتر از میلی ثانیه باشه

----------


## Ananas

> اما شما در ویندوز که اجرا میکنید کل سیستم در اختیار شما نیست . در نتیجه  ممکنه هر بار ی نتیجه بگیرید (البته اونقدر تفاوت نباید محسوس باشه )


بله همینطوره هر دفعه فرق میکنه اما تفاوت ها حول عدد خاصی میچرخه و اعدادمشابه وقتی دیده میشه نتیجه می گیریم تفاوت سرعت خیلی کمه. البته من موقع گرفتن تست هیچ کار دیگه ای از دستگاه نمیکشم حتی برنامه ی پخش موسیقی رو هم می بندم و برای بهتر مقایسه کردن میشه محیط برنامه نویسی رو هم بست و فقط فایل exe رو از داخل پوشه اجرا کرد. مهم اینه که سعی کنیم هر دوشون در شرایط نسبتا یکسان و روی یک سیستم آزمایش بشن.



> برای گرفتن زمان با دقت بالاتر میتونید از تابع QueryPerformanceCounter برای گرفتن زمان اجرای کد با دقت بالا (میکروثانیه باید باشه) استفاده کنید


فکر میکنم دقتش بستگی به هرتز cpu داشته باشه که در زمان اجرا بسته به سخت افزار می تونه متفاوت بشه. منم تو کدم از همین استفاده کردم. کد من رو بازم ببینید :

double GetNow()
{
    LARGE_INTEGER lic, lif;
    QueryPerformanceCounter(&lic);
    QueryPerformanceFrequency(&lif);
    return (double)lic.QuadPart / (double)lif.QuadPart;
}


خیلی تابع خوبی هست برای زمان. تو کارهای انیمیشنی و کار با فریم بر ثانیه خیلی میتونه مفید باشه.

----------


## #target

آره . ی همچین چیزی . ی دستور اسمبلی هم هست RDTSC که میاد TimeStamp Counter رو داخل رجیستر EDX:EAX قرار میده 
این مقاله شاید جالب باشه براتون : Game Timing and Multicore Processors

----------


## mr AHR

ببینم GCC + Qt در بعضی موارد ( علی الخصوص سرعت و پایداری ) بهتر نیست ؟؟؟
C++‎‎ CLI چی ( منظورم خارج از MFC و اینهاست ) ؟؟؟
C++‎‎ CX ( البته اسمشو شک دارم ) چی ؟؟؟
و درسته که میگن Java حداکثر 20% کند تره از C++‎‎ ( یه مقاله بلند بالا مقایسه کرده بود و نتیجه گرفته بود )

----------


## #target

> ببینم GCC + Qt در بعضی موارد ( علی الخصوص سرعت و پایداری ) بهتر نیست ؟؟؟
> C++‎‎ CLI چی ( منظورم خارج از MFC و اینهاست ) ؟؟؟
> C++‎‎ CX ( البته اسمشو شک دارم ) چی ؟؟؟
> و درسته که میگن Java حداکثر 20% کند تره از C++‎‎ ( یه مقاله بلند بالا مقایسه کرده بود و نتیجه گرفته بود )


نمیشه گفت اونا پایدار تر یا سریعترن !
CLI میاد و کتابخانه دات نت رو در سی ++ میاره برای استفاده .
C++‎0x هست که نسخه جدیدی از استاندارد این زبان هست در سال 2011 ارایه شده
جاوا فایلهاش احتیاج به ماشین مجازی داره و مستقیم کد ماشین نیست پس میتونه کندتر باشه

----------

