หน้าแรก
 การบ้าน
  C/C++ new
  Java new
 Sourcecode.TV
  Android
  Blackberry
  C/C++
  Java
  Linux
  Windows Phone
  แจ้งเรื่องที่ต้องการ
 บทความ
  .NET
  Android
  Blackberry
  C++Builder
  Delphi
  Java
  Mobile
  Open Source
  Pocket PC
  Visual Basic
  Web
  Windows Phone
  Others
 แบบเรียนฟรี
  ASP
  ASP.NET Webmatrix
  C++
  eVB
  J2ME
  Java
  PHP
 ซอร์สโค้ด
  Android
  ASP
  C++
  VC++
  CGI-Perl
  Delphi
  Java
  jQuery
  PHP
  Visual Basic
  .NET
 บริการจากเรา
  เปิดท้าย... ขายโค้ด
  DoodeeHosting
  รับออกแบบ พัฒนาเว็บไซต์
  Freeware
  อัตราค่าโฆษณา
  รายชื่อลูกค้า
  สถิติผู้เข้าเว็บ
 ดาว์นโหลด
 ค้นหาข้อมูล
 กระดานสนทนา
  .NET
  C/C++
  Delphi
  Java
  Palm/PocketPC
  Visual Basic
  Web
  อื่นๆ
 กระดานงาน
 ลิงค์เว็บ
 เกี่ยวกับผม
 อัตราค่าโฆษณา
Social Network

Facebook  Twitter  YouTube
 New Article
 Webboard
 Freelanceboard
Freeware
โปรแกรมเบอร์ดี (BerDee)
โปรแกรมเบอร์ดี (Android)
เกมส์เป่ายิ้งฉุบ
เกมส์เป่ายิ้งฉุบ(Android)
WebcamMonitor
WebcamMonitor(Windows)
scSendMail
scSendMail(Windows)
MSN Caption
MSN Caption(Windows)
  Freelance comment
  ติดต่อสอบถามมาได้ตลอดนะครับ...
2015-07-29 13:35:58
  ถ้าผมต้องการเว็บที่พัฒนาด้วย HTML5 ...
2015-01-18 15:33:54
  ถ้าผมต้องการเว็บที่พัฒนาด้วย HTML5 ...
2015-01-18 15:32:51
  ติดต่อสอบถามเข้ามาได้นะคับ
งานเล...

2014-01-06 12:47:38
  ถ้ายังหาคนสอนไม่ได้ ก็ลองศึกษาเองได...
2013-07-06 01:04:37
  สนใจส่งขอบเขตมาคุยราคาก่อนได้นะคับ...
2013-03-24 18:54:20
  ถ้ายังไม่มีคนรับงานติดต่อได้ครับ 08...
2012-12-16 19:18:14
  สนใจคะ ติดต่อ 0905076277...
2012-11-12 11:07:46
  รับทำโปรเจ็คนักศึกษาหรือบริษัท
ส...

2012-10-29 03:10:46
  sukit_te34@hotmail.com...
2012-10-29 03:09:36
  Webboard comment
  รับ สอน matlab เขียน matlab...
2017-06-03 16:27:23
  เฉพาะทางขนาดนี้ คงต้องดูหาข...
2017-05-25 16:18:08
  โห เครื่องรุ่นไหนครับ os รุ...
2017-05-25 16:12:47
  ถ้าเขียน php ก็ใช้ curl ส่...
2017-04-20 01:04:20
  เขียนโค้ดไม่เป็น เอาโค้ดไป ...
2017-03-27 12:50:54
  คือสงสัยว่าทำไม ต้องอัพเดทด...
2017-03-27 12:37:20
  ทดสอบการตอบ...
2017-02-22 13:10:24
  ลองอีกวิธีเขียน recursive f...
2017-02-14 13:11:03
  อยากได้ โค้ดระบบห้องสมุดมาก...
2017-01-30 11:45:28
  ทำ for-loop ซ้อนกัน
โดย...

2017-01-28 16:00:12
  Homework comment
  ทำเอง งง เอง กะลังทำใหม่ค่ะ ^^...
2017-04-18 18:40:46
  ทำเอง งง เอง กะลังทำใหม่ค่ะ ^^...
2017-04-18 18:37:54
  ประเด็นแรก flowchart มันไม่มีภ...
2017-04-18 17:43:33
  อยากได้ flowchart ค่ะ เป็นภาษา...
2017-04-18 16:25:29
  kungking คำถามคืออะไรครับ ?...
2017-03-18 23:28:36
  จงเขียนโปรแกรมแสดงผลรวมของตัวเ...
2017-03-06 10:56:25
  ก็โค้ดทำงานคล้ายๆแบบนี้หละ แต่...
2016-09-06 01:00:12
  ผมอยากทราบว่าโค้ดนับถอยหลังเป็...
2016-09-05 09:31:27
  ได้โค้ดแล้ว ลองศึกษาแล้วเขียนผ...
2016-04-22 00:47:49
  ขอแผนผังของโปรแกรมนับตัวอักษรภ...
2016-04-21 19:24:55
  Article comment
  ครับ คุณ "ติด" แล้วลองนึกต่อว่...
2016-06-18 15:21:09
  vs2008 c# ครับ ขอบคุณครับ...
2016-06-17 14:39:30
  ผมใช้ vs c# ทำตามทุขั้นตอนแต่ต...
2016-06-17 14:37:44
  ต้องวิเคราะห์ครับ "ว่าจริงๆ ส่...
2016-03-12 23:36:05
  ผมส่งข้อความในวง LAN ได้เฉพาะค...
2016-03-12 18:25:42
  โปรแกรม Terminal บน Mac ก็เป็น...
2016-02-16 11:02:01
  โปรแกรม Terminal คืออะไรหรอคะ...
2016-02-16 05:58:21
  ไปตั้ง โครงการไว้เลยครับ ที่
2016-01-25 13:29:55
  ด่วน!!! ต้องการคนเขียน App โดย...
2016-01-25 10:56:34
  ผมได้ทำตามคำแนะนำจนสิ้นสุดแล้ว...
2016-01-20 23:30:25
  9Mcode comment
  อยากได้...
2014-02-21 08:52:19

Link Exchange

อัตราค่าโฆษณา
Statistics of Sourcecode in Thailand
 
เพิ่มความเร็วในการ Build โปรแกรมของ C++ Builder โดยใช้เทคนิค Pre-Compiled Headers (อ่าน 10,085)
บทความโดย Artist / syootakarn@hotmail.com 

- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -

 
 
Freelanceรับพัฒนาโปรแกรม และเว็บ โดย 9'M 

? ? การ Build ของคอมไพเลอร์ในที่นี้หมายถึง กระบวนการ Compile + กระบวนการ Link เพื่อสร้าง Execute File ขึ้นมา จุดประสงค์ของบทความนี้ เพื่อที่จะเสนอแนะแนวทางแก้ไขเพื่อเพิ่มความเร็ว ในการ Build Project ที่เราสร้างขึ้นมา

? ? เข้าเรื่องเลยนะครับ ในสมัยก่อน Compiler ภาษา C เวลาคอมไพล์โปรแกรมเราจะพบว่า ใช้เวลาในการ Build Project น้อยมาก ต่างจาก C++ ซึ่งใช้เวลานานกว่ามาก เหตุที่นานกว่าก็เพื่อได้มาซึ่งคุณสมบัติที่ดีตามแนวทาง OOP (เค้าว่าอย่างงั้น) อันได้แก่ คุณสมบัติการสืบทอด คุณสมบัติการห่อหุ้มข้อมูล ฯลฯ คุณสมบัติต่าง ๆ เหล่านี้ทำให้ตัว คอมไพล์เลอร์ต้องใช้เวลาในการแปลนานมาก ยิ่งมีคุณสมเหล่านี้มากเท่าไหร่ก็ยิ่งใช้ เวลาแปลนานมากขึ้นเป็นเงาตามตัว จะเห็นว่าคุณสมต่างที่มีนั้นเราแทบจะไม่สามารถ แก้ไขหรือปรับปรุงให้มันเร็วขึ้นมากมายนัก กล่าวคือเร็วขึ้นก็นิดหน่อย ทำอย่างไรดีหนอ ๆ ลองดูโปรแกรมตัวอย่างข้างล่าง

//-------- First.cpp

int main()
{
return 0;
}


//-------- Second.cpp
#include
int main()
{
return 0;
}

เมื่อลองเปรียบเทียบโปรแกรมทั้งสองตัวจะพบว่าต่างกันตรงที่โปรแกรม Second.cpp มีคำสงวน #include หรือพูดง่าย ๆ คือต่างกันแค่ 1 บรรทัด แต่ถ้าดูกันจริง ๆ แล้วอันนี้แหละครับคือปัญหาที่ทำให้การ Build โปรแกรมของเราล่าช้า

//-------- Second.cpp
#include
//--- คุณแทบจะไม่ได้แก้ไขใน iotream.h เลย
int main()
{

cout << "Hello C++ Builder"; //คุณแก้ไขในส่วนนี้บ่อย ๆ

return 0;
}

จากโปรแกรมข้างบนจะเห็นว่าส่วนที่แก้ไขบ่อยที่สุดคือในส่วนของฟังก์ชั่น Main() แต่ส่วนที่อยู่ใน #include เราไม่ได้แก้ไขมันเลย ถ้าหากเราสามารถกำหนดได้ว่าโปรแกรมส่วนใด หรือ Module ที่ไม่มีการแก้ไขก็ให้แปลเฉพาะครั้งแรกเท่านั้นครั้งต่อไปไม่ต้องแปลซ้ำอีก จะช่วยลดเวลาในการ Build ลงไปได้บ้างการแก้ไขโปรแกรมของเราก็จะรวดเร็วขึ้น เพราะอย่างไร เสียคุณคงต้องมีการแก้ไขโปรแกรมที่เขียนมากกว่าหนึ่งครั้งอยู่แล้ว

? ? ในปัจจุบัน C++ Compiler แทบทุกตัวมีความสามารถที่จะรู้ว่าโปรแกรมตรงส่วนไหนถูกแปล ไปแล้วไม่ว่าจะเป็น Microsoft Visual C++ หรือ Borland C++ Builder ในส่วนของ Microsoft Visual C++ ผมจะไม่กล่าวถึงนะครับ (เอาไว้โอกาสต่อไป)

? ? ในโปรแกรม Borland C++ Builder เราสามารถเลือกได้ว่าจะเรียกใช้คุณสมบัตินี้หรือไม่ ซึ่งทาง Borland เรียกคุณสมบัตินี้ว่า Pre-compiled headers การใช้งานมี 2 แบบคือ

? ? วิธีที่ 1. ใช้งานผ่านเมนู Project --> Options และกำหนดค่าว่าจะใช้หรือไม่ใช้คุณสมบัตินี้ โดยปกติเมื่อเราสร้าง Project ค่าปกติจะถูกตั้งเป็นค่า Use pre-compiled headers ให้อยู่แล้ว ตัวอย่างข้างล่างจะเป็นการทดสอบคุณสมบัติดัง กล่าวนี้ผ่านทางเมนู Project --> Options โดยแบ่งเป็น 2 Project ตั้งค่าให้ Project แรกเรียก ใช้คุณสมบัตินี้ อีก Project ไม่เรียกใช้คุณสมบัตินี้จากนั้นบันทึกเวลาที่ใช้ในการ Build มาแสดง เปรียบเทียบภาพรวม

ก่อนอื่นตั้งค่าโปรแกรมโดยเลือกที่เมนู Project -->Options จะปรากฏหน้าต่างขึ้นตามข้างล่าง

จากรูปข้างบนเป็นการตั้งค่าเพื่อกำหนดให้ Project ของเราไม่ให้เรียกใช้คุณสมบัติ Pre-compiled headers โดยตั้งค่าให้เป็น None ถ้าต้องการกำหนดให้ใช้คุณสมบัติดังกล่าวก็คลิกเลือก Use pre-compiled headers หรือ Cache Pre-compiled headers จะเลือกตัวไหนก็ได้

เพื่อให้เห็นถึงข้อแตกต่างลองสร้าง Project ขึ้นมาสองตัวตัวนึงใช้คุณสมบัตินี้อีกตัวนึงไม่ใช้จากนั้น ลองเปรียบเทียบเวลาที่ใช้ในการ Build ซึ่งจะปรากฏอยู่บน Title bar ของโปรแกรม Borland C++ Builder หลังจากเสร็จขั้นตอนการ Build แล้ว ดูตามตัวอย่างข้างล่างครับ

แสดงว่าใช้เวลาในการ Build 2.12 วินาที

ถ้าหลังจาก Build โปรเจคแล้วตรง Title Bar ไม่แสดงเวลาหมายความว่าโปรแกรมไม่มีการแก้ไข อะไรเพิ่มเติมคอมไพล์เลอร์ก็จะเรียก Execute File ตัวเดิมขึ้นมาใช้งานเลย กล่าวคือไม่ได้ Build ใหม่นั่นเอง

จากรูปข้างบนแสดงว่าคอมไพล์เลอร์ทำการแปลคำสั่งทั้งหมด 10 บรรทัด

ทีนี้ทดลอง Build Project ทั้งสองตัวโดยให้จับเวลาแล้วนำเปรียบเทีบกันตามตารางข้างล่าง

ขั้นตอน

โปรแกรมเรียกใช้คุณสมบัติ Pre-compiled headers(ใช้เวลาเป็นวินาที)

โปรแกรมไม่ได้เรียกใช้คุณสมบัติ Pre-compiled headers(ใช้เวลาเป็นวินาที)

Build โปรเจ็คครั้งแรก
3.07
9.50
Build โปรเจ็คครั้งที่สอง
0
0
นำปุ่มมาวางบน Form แล้ว Build ใหม่อีกครั้ง
1.17
4.49
Build โปรแกรมใหม่อีกครั้ง
0
0

ใส่คำสั่งเข้าไปในโปรแกรม

โดย Double Click ที่ปุ่ม

แล้วพิมพ์คำสั่ง ShowMessage("Hello C++ Builder"); จากนั้น Build โปรแกรม

1.03
5.98

Build โปรแกรมใหม่อีกครั้ง

0
0

?

จากตารางข้างบนจะเห็นว่าคุณสมบัติ Pre-compiled headers ช่วยเพิ่มความเร็วในการ Build โปรแกรมได้มากและจะเห็นผลต่างมากขึ้นถ้าโปรแกรมที่คุณเขียนมีขนาดใหญ่มาก ๆ และต้องแก้ไข โปรแกรมบ่อย ๆ คุณสมบัตินี้ช่วยคุณได้มากทีเดียวครับ

วิธีที่ 2. ใช้งานโดยแก้ไขในส่วนของโค๊ด โดยปกติแล้ว Borland C++ Builder จะกำหนดให้ Project ที่สร้างขึ้นเรียกใช้คุณสมบติ Pre-compiled headers โดยอัตโนมัติอยู่แล้ว

คุณสมบัติ Pre-compiled headers ไม่เพียงแต่จะสามารถกำหนดโดยผ่านทางเมนู Project --> Options เพียงทางเดียวเราสามารถกำหนดโดยใส่ไว้ใน Code ใน Project ของเราได้เลย โดยเรียกใช้คำสงวน #pragma hdrstop โดยให้ใส่ส่วนของ Include File ที่ไม่แก้ไขบ่อย ๆ หรือไม่ได้แก้ไขวางไว้ก่อนคำสงวนนี้ ดูรายละเอียดตามโปรแกรมข้างล่าง

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

#include

//ใส่ Include ไฟล์หรือคำสั่ง Links //ต่างที่คุณต้องการให้คอมไพล์เลอร์ทำการแปลครั้งแรกที่ทำการ Build //แล้วนำไปเก็บไว้ในรูปแบบของ Binary File //ต่อไปหากไม่มีการแก้ไขให้นำ Binary File //นั้นมาต่อเข้าโปรแกรมโดยไม่การแปลใหม่

#pragma hdrstop //หลังคำสั่งนี้ต้องแปลทุก ๆ ครั้งที่ Build โปรแกรม

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("Hello C++ Builder");
}
//---------------------------------------------------------------------------

จากนั้นทดลองแก้ไขโปรแกรมโดยใส่ส่วน include file ที่คุณไม่ได้แก้ไขบ่อยหรือแทบจะไม่แก้ไข เลยไว้ก่อนคำสั่ง #pragma hdrstop แล้วลอง Build โปรแกรมแล้วดูโดยอาจจะลอง เปรียบเทียบเวลา กับ Project ที่ไม่ได้เรียกใช้คุณสมบัตินี้จะพบว่าเวลาที่ใช้ในการ Build โปรแกรมเร็วขึ้นอย่างมาก

 

- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -

สอบถาม
  • ห้ามการโฆษณา หากต้องการติดต่อหาลูกค้า ติดต่อโฆษณาโดยตรงได้ที่ webmaster@sourcecode.in.th
  • ห้ามใช้คำหยาบและคำพูดที่ไม่เหมาะสม
  • ขอสงวนสิทธิหากตรวจพบ ข้อความที่ไม่เหมาะสม ข้อความนั้นจะถูกลบทันที
ชื่อ
อีเมล์
รายละเอียด

 
 
สายต่อจอ สำหรับเครื่อง macbook pro 2016 (usb-c to HDMI)
สายต่อจอ สำหรับเครื่อง macbook pro 2016 (usb-c to HDMI) ความละเอียดระดับ 4K
หัวแปลง Mini DisplayPort to HDMI Adapter หัวแปลง Mini DisplayPort to HDMI Adapter สำหรับเครื่อง macbook air/pro, mac mini
หัวแปลง Mini DisplayPort to HDMI Adapter สำหรับเครื่อง macbook air/pro, mac mini
สายต่อหูฟัง และชาร์จไฟ สำหรับ iPhone 7 และ 7 Plus
สายต่อหูฟัง และชาร์จไฟ สำหรับ iPhone 7 และ 7 Plus
หัวแปลงจาก USB-C Type ไปเป็น USB 3.1 สำหรับ MacBook
หัวแปลงจาก USB-C Type ไปเป็น USB 3.1 สำหรับ MacBook
ไขควงสำหรับเครื่อง Macbook Air/Pro
ไขควง สำหรับแกะเครื่อง Macbook Air/Pro (300บาท)
HDMI เข้า 3 ออก  1 มีรีโมท
HDMI เข้า 3 ออก 1 มีรีโมท (350บาท)
คลิปสอนเขียนโปรแกรม
เรียนเขียนโปรแกรมดอทเน็ต
เรียนเขียนโปรแกรมแอนดรอยด์
เรียนเขียนโปรแกรมเบล็คเบอร์รี่
เรียนเขียนโปรแกรมซี ซีพลัสพลัส
เรียนเขียนโปรแกรมจาวา
เรียนการใช้งานลินุกส์
เรียนการเขียนโปรแกรมวินโดว์โฟน
เรียนการเขียนโปรแกรมพีเฮชพี มายเอสคิวเอล
9M Blog บอกเล่าเรื่องราว การเขียนโปรแกรมของ นายเอ็ม
บริการ ถ่ายภาพรับปริญญา
OrmSin.com: ขายหนังสืองานฝีมือไทย-ญี่ปุ่น-จีน (country crafts)
อัตราค่าโฆษณา
 
บทความที่เกี่ยวข้อง

Dynamic Cast ใน C++ Builder

การซ่อนโปรแกรมไม่ให้แสดง Icon บน Taskbar

จะรู้ได้อย่างไรว่าโปรแกรมที่เราสร้างเรียกใช้ DLL ตัวไหนบ้าง

การนำ MFC Project ของ Microsoft Visual C++ มาใช้งานใน Borland C++ Builder

Borland Delphi & C++ Builder History

แสดงรายชื่อ Parent Class ของ Component

การตั้งค่าให้ CPPWebBrowser ให้สามารถใช้งาน Hotkey Cut ,Copy, Paste ได้

โปรแกรมแสดงตัวอย่าง Font
Tutorial
eVB Tutorial
ASP.NET Webmatrix Tutorial
J2ME Tutorial
C++  Tutorial
Java  Tutorial
PHP Tutorial
ASP Tutorial
 
แบบสำรวจ
Freelance รับพัฒนาโปรแกรม

Home - Article - Tutorial - Sourcecode - Dev Handbook - Search - WebBoard - Links - About Us

สงวนลิขสิทธิ์ ห้ามคัดลอก ทำซ้ำ แก้ไข ดัดแปลง ไม่ว่าในรูปแบบใด โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์จากกระทรวงพาณิชย์: 7100503002000
Copyright 2001 SourceCode.in.th