List.Buffer เก็บรายการข้อมูลไว้ในหน่วยความจำเพื่อเพิ่มประสิทธิภาพเมื่อต้องเข้าถึงรายการเดียวกันหลายครั้ง ฟังก์ชันนี้มีประโยชน์เมื่อต้องใช้ผลลัพธ์จากการคำนวณซ้ำๆ หรือเมื่อต้องการลดจำนวนการเข้าถึงแหล่งข้อมูลภายนอก
=List.Buffer(list as list) as list
=List.Buffer(list as list) as list
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| list | list | Yes | รายการที่ต้องการเก็บในหน่วยความจำ |
เมื่อต้องใช้รายการเดียวกันหลายครั้ง ให้เก็บไว้ในหน่วยความจำ
แทนที่จะเข้าถึงแหล่งข้อมูลภายนอกซ้ำๆ ให้เก็บผลลัพธ์ในหน่วยความจำ
เก็บผลลัพธ์ของรายการเพื่อใช้ในการคำนวณหรือการกรองข้อมูลต่างๆ
List.Buffer({1, 2, 3, 4, 5})=List.Buffer({1, 2, 3, 4, 5})
{1, 2, 3, 4, 5}
let Filtered = List.Select({1..1000}, each _ > 500), Buffered = List.Buffer(Filtered) in Bufferedlet Filtered = List.Select({1..1000}, each _ > 500), Buffered = List.Buffer(Filtered) in Buffered
รายการ {501, 502, ..., 1000}
let Source = {"apple", "banana", "cherry"}, Buffered = List.Buffer(Source) in Bufferedlet Source = {"apple", "banana", "cherry"}, Buffered = List.Buffer(Source) in Buffered
{"apple", "banana", "cherry"}
ผมแนะนำให้ใช้เมื่อ: 1) ต้องใช้รายการเดียวกันหลายครั้ง 2) แหล่งข้อมูลมาจากภายนอก (ช้า) 3) ต้องการประหยัด CPU มากกว่า หน่วยความจำ สำหรับรายการเล็กๆ จากหน่วยความจำแล้ว อาจไม่มีประโยชน์
ผมได้ใช้ทั้งคู่บ่อย List.Buffer ใช้กับรายการ (List) ส่วน Table.Buffer ใช้กับตาราง (Table) หลักการเดียวกัน คือประมวลผลทั้งหมดแล้วเก็บในหน่วยความจำ
ส่วนตัวผม มันขึ้นอยู่กับขนาดของรายการและชนิดข้อมูล รายการหนึ่งล้านแถว มี 10 คอลัมน์ อาจใช้หลาย MB สำหรับรายการตัวเลขง่ายๆ ใช้น้อยมาก ลองใช้เมื่อต้องประสิทธิภาพจริง
List.Buffer เก็บรายการข้อมูลไว้ในหน่วยความจำแบบ eager evaluation (ประมวลผลทั้งหมดตั้งแต่ต้น) แทนที่จะใช้ lazy evaluation ที่ประมวลผลเมื่อต้องการ เมื่อต้องใช้รายการเดียวกันหลายครั้ง ฟังก์ชันนี้จะประหยัดเวลาคำนวณได้มาก เพราะไม่ต้องคำนวณซ้ำ
ที่เจ๋งคือ List.Buffer คือเครื่องมือ trade-off ระหว่างหน่วยความจำและความเร็ว ใช้หน่วยความจำมากขึ้น แต่ลดการคำนวณซ้ำ ซึ่งมีประโยชน์โดยเฉพาะเมื่อรายการที่อ้างอิงจากแหล่งข้อมูลภายนอก (ไฟล์, API, ฐานข้อมูล) และต้องใช้หลายครั้ง
ส่วนตัวผม ผมมักใช้ List.Buffer กับ List.Select หรือ List.Transform ที่ซ้ำหลายครั้ง โดยเฉพาะเมื่อข้อมูลมาจากแหล่งที่ช้า ประหยัดกว่าเรียกแหล่งข้อมูลหลายรอบ 😎