? ? การ 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
โปรแกรมเร็วขึ้นอย่างมาก |