2006/Apr/21

วันนี้ไปเจอบทความหนึ่งที่พูดถึงการทดสอบความเร็วในการประมวลตรวจสอบข้อความที่เป็นตัวเลข(Numeric) จึงเอามาเขียนใน Blog เพื่อเพิ่มความเข้าใจ บางครั้งเราเห็นว่ามันเป็นเรื่องเล็กๆแต่การเขียนโปรแกรมที่ดีนั้น คงหนีไม่พ้นการเขียนโปรแกรมของเราให้ใช้ทรัพยากรเครื่องน้อยที่สุด
ใน .Net มีวิธีในการตรวจสอบข้อมูลที่เป็นตัวเลขหลายวิธี ในที่นี้นำมาทดสอบ 6 วิธีด้วยกัน คือ
#1. Regular Expression - คือการนำ Regular Expression (^(\d*\.?\d*)$) มาใช้เพื่อตรวจสอบหาตัวเลขระหว่าง 0-9

148 public static System.Text.RegularExpressions.Regex IsNumeric =

149 new System.Text.RegularExpressions.Regex(@"^(\d*\.?\d*)$",

150 System.Text.RegularExpressions.RegexOptions.Compiled &

151 System.Text.RegularExpressions.RegexOptions.CultureInvariant);


#2. Try ToDouble & Catch - เป็นการเรียกใช้ System.Convert.ToDouble ซึ่งอยู่ภายใต้คำสั่ง try-catch ถ้าคืนค่ากลับเป็นจริงแสดงว่าไม่มีข้อผิดพลาด นั้นก็คือเป็นตัวเลข แต่ถ้าเกิดมี error แสดงว่า ข้อมูลที่ได้รับนั้นไม่ใช่ตัวเลข

160 public bool TryToDouble(object expression)

161 {

162 try

163 {

164 expression = Convert.ToDouble(expression);

165 return true;

166 }

167 catch

168 {

169 return false;

170 }

171 }


#3. Try Parse & Catch - เป็นการเรียกใช้ System.Double.Parse ซึ่งอยู่ภายใต้คำสั่ง try-catch ถ้าคืนค่ากลับเป็นจริงแสดงว่าไม่มีข้อผิดพลาด นั้นก็คือเป็นตัวเลข แต่ถ้าเกิดมี error แสดงว่า ข้อมูลที่ได้รับนั้นไม่ใช่ตัวเลข

180 public bool TryParse(object expression)

181 {

182 try

183 {

184 expression = double.Parse(expression.ToString());

185 return true;

186 }

187 catch

188 {

189 return false;

190 }

191 }


#4. Double.TryParse - ใช้ System.Double.TryParse เพื่อตรวจสอบข้อมูลที่เป็นตัวเลข จนกว่าจะคืนค่าที่เป็นจริงแสดงว่ามีการเปลี่ยนแปลงค่าที่เป็นตัวเลขสำเร็จ

262 isNumeric = double.TryParse(this.InputValue.Text,

263 System.Globalization.NumberStyles.AllowDecimalPoint,

264 System.Globalization.NumberFormatInfo.CurrentInfo,

265 out result);


#5. VisualBasic IsNumeric - เป็นการเรียกใช้ Namespace ของMicrosoft.VisualBasic.Information.IsNumeric เพื่อตรวจสอบข้อมูลที่เป็นตัวเลข

269 isNumeric = Microsoft.VisualBasic.Information.IsNumeric (this.InputValue.Text);


#6. Incremental Char - เป็นการวน loop String ทีล่ะตัวแล้วนำมาเปรียบเทียบว่าเป็นตัวเลขหรือเปล่าโดยใช้ System.Char.IsNumber

200public bool IncrementalChar(string expression)

201 {

202 bool hasDecimal = false;

203 for(int i=0;i<expression.Length;i++)

204 {

205 // Check for decimal

206 if (expression[i] == '.')

207 {

208 if (hasDecimal) // 2nd decimal

209 return false;

210 else // 1st decimal

211 {

212 // inform loop decimal found and continue

213 hasDecimal = true;

214 continue;

215 }

216 }

217 // check if number

218 if(!char.IsNumber(expression[i]))

219 return false;

220 }

221 return true;

222 }

เครื่องที่ใช้ในการทดสอบ
Dell Inspiron 8500 with a Pentium 4-M 2.2GHz CPU, 1GB DDR PC2100 RAM, and 40GB 5400RPM IDE HD
ผลการทดสอบ กรณีที่ข้อมูลที่ตรวจสอบ "ถูกต้อง"

ผลการทดสอบ กรณีที่ข้อมูลที่ตรวจสอบ "ไม่ถูกต้อง"



ผลที่ได้ คงเปรียบเทียบกันเห็นได้จากภาพซึ่งแน่นอนครับวิธีที่ 6 ใช้เวลาในการประมวลผลน้อยที่สุดทั้ง 2 กรณี ถ้าอยากอ่านรายละเอียดเพิ่มเติมอ่านได้ที่นี้
http://aspalliance.com/80

Code สำหรับคนเขียน Vb สำหรับวิธีที่ 6


267 Private Function IsNumeric(ByVal expression As String) As Boolean

268 Dim hasDecimal As Boolean = False

269 Dim i As Char

270 For Each i In expression

271 ' Check for decimal

272 If i = "." Then

273 If hasDecimal Then

274 Return False

275 Else

276 hasDecimal = True

277 End If

278 End If

279 ' check if number

280 If Not Char.IsNumber(i) Then

281 Return False

282 End If

283 Next

284 Return True

285 End Function



ชื่อ: 
เว็บไซต์: 
คอมเมนต์:




smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry
re ช้าไม่ค่อยแปลกใจ
isNumber ก็ช้าด้วยนี่แปลกๆ
ต้องเอา CIL มาดูแล้ว
#1  by  veer At 2006-04-21 21:37, 
ได้ความยังไงบอกผมด้วยนะครับ
#2  by  Code SNippet At 2006-04-21 22:36, 
อะนะ
นึกว่าจะดูให้
#3  by  veer At 2006-04-22 15:40, 

<< Home