การเปิดตัวของภาษาโปรแกรม Julia 1.12 ได้รับการเผยแพร่แล้ว โดยรวมคุณสมบัติต่างๆ เช่น ประสิทธิภาพสูง รองรับการพิมพ์แบบไดนามิก และเครื่องมือในตัวสำหรับการเขียนโปรแกรมแบบขนาน ไวยากรณ์ของ Julia ใกล้เคียงกับ MATLAB โดยมีองค์ประกอบบางอย่างที่ยืมมาจาก Ruby และ Lisp วิธีการจัดการสตริงนั้นชวนให้นึกถึง Perl รหัสโครงการแจกจ่ายภายใต้ใบอนุญาต MIT
คุณสมบัติที่สำคัญของภาษา:
- ประสิทธิภาพสูง: หนึ่งในเป้าหมายหลักของโครงการคือการบรรลุประสิทธิภาพที่ใกล้เคียงกับโปรแกรม C คอมไพเลอร์ Julia อิงตามโครงการ LLVM และสร้างรหัสเครื่องเนทีฟที่มีประสิทธิภาพสำหรับแพลตฟอร์มเป้าหมายจำนวนมาก
- รองรับกระบวนทัศน์การเขียนโปรแกรมที่หลากหลาย รวมถึงองค์ประกอบของการเขียนโปรแกรมเชิงวัตถุและการทำงาน ไลบรารีมาตรฐานจัดเตรียมฟังก์ชันสำหรับ I/O แบบอะซิงโครนัส การจัดการกระบวนการ การบันทึก การทำโปรไฟล์ และการจัดการแพ็คเกจ เหนือสิ่งอื่นใด
- การพิมพ์แบบไดนามิก: ภาษาไม่ต้องการคำจำกัดความที่ชัดเจนของประเภทสำหรับตัวแปร โดยเปรียบเทียบกับภาษาโปรแกรมสคริปต์ รองรับโหมดโต้ตอบ
- ความสามารถเพิ่มเติมในการระบุประเภทอย่างชัดเจน
- ไวยากรณ์ที่ยอดเยี่ยมสำหรับการคำนวณตัวเลข การคำนวณทางวิทยาศาสตร์ ระบบแมชชีนเลิร์นนิง และการสร้างภาพข้อมูล รองรับประเภทข้อมูลตัวเลขและเครื่องมือสำหรับการคำนวณแบบขนาน
- ความสามารถในการเรียกใช้ฟังก์ชันโดยตรงจากไลบรารี C โดยไม่ต้องเพิ่มเลเยอร์เพิ่มเติม
การเปลี่ยนแปลงที่สำคัญใน Julia 1.12:
- คุณสมบัติภาษาใหม่
- ตัวเลือก "--trim" แบบทดลองจะสร้างไบนารีที่กระชับยิ่งขึ้นโดยการลบโค้ดที่ไม่สามารถเข้าถึงได้จากจุดเข้าที่ระบุ จุดเข้าสามารถทำเครื่องหมายได้โดยใช้ "Base.Experimental.entrypoint" โค้ดบางรหัสอาจไม่สามารถทำงานร่วมกับตัวเลือกนี้ได้
- ขณะนี้การแทนที่ค่าคงที่ได้รับการกำหนดไว้อย่างชัดเจนและเป็นไปตามความหมายของยุคโลก อนุญาตให้มีการแทนที่เพิ่มเติม (เช่น ประเภท)
- มีการเพิ่มพารามิเตอร์ใหม่ "usings::Bool" ลงในฟังก์ชัน "names" ทำให้ฟังก์ชันส่งคืนชื่อทั้งหมดที่มองเห็นได้ผ่าน "using"
- ขณะนี้แมโครแฟมิลี @atomic รองรับไวยากรณ์การกำหนดค่าอ้างอิง เช่น @atomic :monotonic v[3] += 4 ซึ่งปรับเปลี่ยน v[3] ในระดับอะตอมด้วยความหมายการเรียงลำดับแบบโมโนโทนิก ไวยากรณ์ที่รองรับประกอบด้วย:
- อ่านอะตอม ("x = @atomic v[3]")
- การกำหนดอะตอม (“@atomic v[3] = 4”)
- การเปลี่ยนแปลงของอะตอม (“@atomic v[3] += 2”)
- การกำหนดค่าอะตอมเดี่ยว (@atomiconce v[3] = 2")
- การสลับอะตอม ("x = @atomicswap v[3] = 2")
- การแทนที่อะตอม ("x = @atomicreplace v[3] 2=>5")
- พารามิเตอร์ใหม่ "--task-metrics=yes" ช่วยให้สามารถรวบรวมข้อมูลเวลาดำเนินการของแต่ละงานได้ พารามิเตอร์นี้สามารถเปิด/ปิดได้ขณะรันไทม์โดยใช้ "Base.Experimental.task_metrics(::Bool)" เมตริกที่ใช้ได้:
- เวลาการดำเนินการจริงของงาน รวมถึงการคอมไพล์และการรวบรวมขยะ ("Base.Experimental.task_running_time_ns")
- เวลาจากช่วงเวลาที่งานเริ่มเสร็จสมบูรณ์ (“Base.Experimental.task_wall_time_ns”)
- รองรับ Unicode 16
- ตอนนี้ "Threads.@spawn" ยอมรับอาร์กิวเมนต์ ":samepool" เพื่อระบุพูลเธรดเดียวกันกับโค้ดที่เรียกใช้งาน "Threads.@spawn :samepool foo()" เป็นคำย่อของ "Threads.@spawn Threads.threadpool() foo()"
- มาโคร "@ccall" สามารถรับอาร์กิวเมนต์ "gc_safe" ได้แล้ว หากอาร์กิวเมนต์นี้เป็นจริง รันไทม์จะสามารถดำเนินการเก็บขยะแบบขนานได้ในขณะที่กำลังเรียกใช้ "ccall"
- การเปลี่ยนแปลงภาษา
- เมื่อแทนที่เมธอดด้วยลายเซ็นที่เทียบเท่า เมธอดเดิมจะไม่ถูกลบ แต่เมธอดใหม่จะมีสิทธิ์เหนือกว่า หากเมธอดใหม่ถูกลบ เมธอดเดิมจะกลับมาทำงานอีกครั้ง ซึ่งมีประโยชน์ เช่น ในการล้อเลียนเฟรมเวิร์กการทดสอบ (SparseArrays, Pluto, Mocking เป็นต้น) เนื่องจากไม่จำเป็นต้องคืนค่าเมธอดเดิมโดยตรง ปัจจุบันสถานการณ์นี้จำเป็นต้องคอมไพล์ใหม่ แต่อาจสามารถนำผลลัพธ์เก่ากลับมาใช้ใหม่ได้ในอนาคต
- การขยายแมโครจะไม่ป้อนนิพจน์ "Expr(:toplevel)" จากแมโครซ้ำๆ ทันทีอีกต่อไป แต่การขยาย ":toplevel" จะถูกเลื่อนออกไปจนกว่าจะรันไทม์ ซึ่งจะทำให้นิพจน์ใน ":toplevel" เดิมสามารถใช้แมโครที่กำหนดไว้ก่อนหน้านี้ได้
- ลูปอินฟินิตี้แบบเล็กน้อย (เช่น "while true; end") จะไม่ถูกพิจารณาว่าเป็นพฤติกรรมที่ไม่ได้กำหนดไว้อีกต่อไป ลูปอินฟินิตี้ที่ทำบางสิ่งบางอย่างจริงๆ (เช่น เมื่อมีผลข้างเคียงหรือนอนหลับ) ไม่เคยถูกพิจารณาว่าเป็นพฤติกรรมที่ไม่ได้กำหนดไว้และไม่ถูกพิจารณาว่าเป็นพฤติกรรมที่ไม่ได้กำหนดไว้
- การทำเครื่องหมายตัวระบุเป็น "สาธารณะ" และ "ส่งออก" ในเวลาเดียวกันถือเป็นข้อผิดพลาด
- ข้อผิดพลาดรันไทม์ใน "getfield" ตอนนี้จะส่งข้อยกเว้นประเภทใหม่ "FieldError" แทน "ErrorException" ทั่วไป
- แมโครในการประกาศฟังก์ชันไม่จำเป็นต้องใช้วงเล็บอีกต่อไป ตัวอย่างเช่น ขณะนี้ "function @main(args) … end" เป็นที่ยอมรับแล้ว ในขณะที่ก่อนหน้านี้ "function (@main)(args) … end" จำเป็นต้องระบุ
- การเรียก "using" กับชื่อแพ็คเกจภายในแพ็คเกจนั้นเอง (ซึ่งมีความเกี่ยวข้องโดยเฉพาะกับโมดูลที่ซ้อนกัน) ตอนนี้จะใช้แพ็คเกจนั้นอย่างชัดเจนโดยไม่ต้องดูที่ Manifest และสภาพแวดล้อม เหมือนกับ "..Name" วิธีนี้สอดคล้องกับพฤติกรรมที่คาดหวังไว้มากขึ้น
- การปรับปรุงคอมไพเลอร์/รันไทม์
- ขณะนี้โค้ดตัวกลาง (IR) ที่สร้างโดย LLVM จะใช้ชนิดตัวชี้แทนการส่งตัวชี้เป็นจำนวนเต็ม ปัญหานี้ส่งผลกระทบต่อ "llvmcall": LLVM IR ในตัวควรได้รับการอัปเดตโดยแทนที่ "i32"/"i64" ด้วย "i8*" หรือ "ptr" และลบการแปลง "ptrtoint"/"inttoptr" ที่ไม่จำเป็นออก เพื่อความเข้ากันได้กับ IR ที่ใช้ตัวชี้จำนวนเต็มยังคงรองรับอยู่ แต่จะแสดงคำเตือน
- การเปลี่ยนแปลงพารามิเตอร์บรรทัดคำสั่ง
- สามารถส่งแฟล็ก "-m/--module" เพื่อเรียกใช้ฟังก์ชัน "main" ภายในแพ็กเกจได้ โดยใช้ชุดอาร์กิวเมนต์ ฟังก์ชันนี้ต้องประกาศด้วย "@main" เพื่อระบุว่าเป็นจุดเริ่มต้น
- ขณะนี้สามารถเปิดหรือปิดใช้งานเอาต์พุตสีของ Julia ได้โดยใช้ตัวแปรสภาพแวดล้อม "NO_COLOR" และ "FORCE_COLOR" ตัวแปรเหล่านี้ยังได้รับการสนับสนุนโดยระบบบิลด์ของ Julia อีกด้วย
- "--project=@temp" เริ่ม Julia ด้วยสภาพแวดล้อมชั่วคราว
- ตัวเลือก "--trace-compile-timing" ใหม่จะพิมพ์เวลาการคอมไพล์ของเอาท์พุตแต่ละวิธีโดย "--trace-compile" เป็นมิลลิวินาที
- ตอนนี้ "--trace-compile" จะพิมพ์วิธีการคอมไพล์ใหม่เป็นสีเหลืองหรือเพิ่มความคิดเห็นหากไม่มีสีดังกล่าว
- ตัวเลือก "--trace-dispatch" ใหม่จะพิมพ์วิธีการที่ได้รับการจัดสรรแบบไดนามิก
- การเปลี่ยนแปลงแบบมัลติเธรด
- ปัจจุบัน Julia ใช้เธรด "แบบอินเทอร์แอคทีฟ" 1 เธรดตามค่าเริ่มต้น นอกเหนือจากเธรด "เวิร์กเกอร์" หลัก 1 เธรด นั่นคือ "-t1,1" ซึ่งหมายความว่างานหลักและ REPL (ในโหมดอินเทอร์แอคทีฟ) ซึ่งทั้งคู่ทำงานในเธรด 1 ตอนนี้ทำงานในพูลแบบอินเทอร์แอคทีฟแล้ว ลูป I/O ของ libuv ยังทำงานในเธรด 1 ด้วย ช่วยให้มั่นใจได้ว่าพูลเวิร์กเกอร์ที่ "Threads.@spawn" ใช้จะทำงานได้อย่างมีประสิทธิภาพ การร้องขอเธรด 1 เธรด ("-t1"/"JULIA_NUM_THREADS=1") หรือ 0 เธรดแบบอินเทอร์แอคทีฟจะปิดใช้งานเธรดแบบอินเทอร์แอคทีฟ: "-t1,0", "JULIA_NUM_THREADS=1,0" หรือ "-tauto,0" การร้องขอมากกว่า 1 เธรดจะเป็นการเปิดใช้งานเธรดแบบอินเทอร์แอคทีฟ ตัวอย่างเช่น "-t2" เทียบเท่ากับ "-t2,1" โปรดทราบว่าบัฟเฟอร์ไม่ควรผูกกับ "threadid()"
- มีการกำหนดประเภทใหม่สำหรับเทมเพลตโค้ดที่ควรเรียกใช้งานเพียงครั้งเดียวต่อกระบวนการ — ประเภท "OncePerProcess{T}" ช่วยให้คุณสามารถกำหนดฟังก์ชันที่จะดำเนินการเพียงครั้งเดียวในครั้งแรกที่เรียกใช้งาน และจะคืนค่าประเภท "T" เดิมเสมอในการเรียกใช้งานครั้งต่อๆ ไป นอกจากนี้ยังมีประเภท "OncePerThread{T}" และ "OncePerTask{T}" สำหรับการใช้งานที่คล้ายกันกับเธรดหรืองาน
- สร้างการเปลี่ยนแปลงระบบ
- เพิ่ม Makefile ใหม่สำหรับการสร้าง Julia และ LLVM โดยใช้ BOLT (Binary Optimization and Layout Tool) ดู "contrib/bolt" และ "contrib/pgo-lto-bolt"
- ฟังก์ชั่นห้องสมุดใหม่
- "logrange(start, stop; length)" สร้างช่วงที่มีอัตราส่วนคงที่แทนที่จะเป็นขั้นตอนคงที่
- ฟังก์ชันใหม่ "isfull(c::Channel)" ตรวจสอบว่า "put!(c, some_value)" จะบล็อกหรือไม่
- "waitany(tasks; throw=false)" และ "waitall(tasks; failfast=false, throw=false)" รอให้หลาย ๆ งานเสร็จสิ้นในเวลาเดียวกัน
- "uuid7()" สร้าง UUID เวอร์ชัน 7 ที่สอดคล้องกับ RFC 9562
- "insertdims(array; dims)" แทรกมิติองค์ประกอบเดียวลงในอาร์เรย์ ซึ่งเป็นการดำเนินการแบบย้อนกลับของ "dropdims"
- ประเภท "Fix" ใหม่จะสรุป "Fix1/Fix2" เพื่อแก้ไขอาร์กิวเมนต์ตัวเดียว
- "Sys.detectwsl()" ตรวจสอบว่า Julia กำลังทำงานภายใน WSL ในระหว่างรันไทม์หรือไม่
- โอกาสใหม่สำหรับห้องสมุด
- "escape_string" ใช้พารามิเตอร์เพิ่มเติม "ascii=true" (เพื่อหลีกเลี่ยงอักขระที่ไม่ใช่ ASCII ทั้งหมด) และ "fullhex=true" (เพื่อใช้รูปแบบเลขฐานสิบหก 4/8 หลักเต็มในการหลีกเลี่ยง u/U เช่น เพื่อความเข้ากันได้กับ C)
- ตอนนี้ "tempname" สามารถรับสตริงต่อท้ายได้ เพื่อให้ชื่อไฟล์รวมคำต่อท้ายนั้นไว้ และนำมาพิจารณาในเรื่องความไม่ซ้ำกัน
- ตอนนี้สามารถใช้ RegexMatch objects เพื่อสร้าง NamedTuple และ Dict ได้แล้ว
- "ล็อคได้" ตอนนี้สามารถส่งออกได้แล้ว
- "Base.require_one_based_indexing" และ "Base.has_offset_axes" เป็นสาธารณะแล้ว
- เพิ่มฟังก์ชันใหม่ "ltruncate" "rtruncate" และ "ctruncate" เพื่อตัดสตริงให้เหลือความกว้างตามข้อความ โดยคำนึงถึงความกว้างของอักขระ
- ขณะนี้ฟังก์ชัน "isless" (และด้วยเหตุนี้ "cmp" การเรียงลำดับ ฯลฯ) ได้รับการรองรับสำหรับ "AbstractArray" ที่มีมิติศูนย์แล้ว
- ตอนนี้ "invoke" อนุญาตให้ส่ง "Method" แทนลายเซ็นประเภทได้
- ตอนนี้ "invoke" ยอมรับ "CodeInstance" แทนประเภท ซึ่งอาจช่วยเพิ่มความเร็วเวิร์กโฟลว์ปลั๊กอินคอมไพเลอร์บางส่วนได้
- ตอนนี้ "Timer(f, …)" สืบทอดค่าความเหนียวของงานหลักเมื่อสร้างงานจับเวลา ซึ่งสามารถแทนที่ได้ด้วยอาร์กิวเมนต์ "spawn" ใหม่ วิธีนี้ช่วยแก้ปัญหาที่งานที่สร้างแบบเหนียว ( "@async") จะทำให้งานหลักเหนียว
- ตอนนี้ "Timer" มีคุณสมบัติ "timeout" และ "interval" ที่อ่านได้ และมีวิธี "show" ที่อธิบายรายละเอียดมากขึ้น
- 'sort' รองรับทูเพิล 'NTuple' แล้ว
- ตอนนี้ "map!(f, A)" จัดเก็บผลลัพธ์ใน "A" เช่น "map!(f, A, A)" หรือ "A .= f.(A)"
- "setprecision" ที่มีอาร์กิวเมนต์ฟังก์ชัน (ปกติผ่านบล็อก "do") ถือว่าปลอดภัยสำหรับเธรดแล้ว ควรหลีกเลี่ยงรูปแบบอื่น และควรย้ายประเภทข้อมูลไปยังการใช้งานจริงโดยใช้ "ScopedValue"
- การเปลี่ยนแปลงไลบรารีมาตรฐาน
- "gcdx(0, 0)" ตอนนี้ส่งคืน "(0, 0, 0)" แทนที่จะเป็น "(0, 1, 0)"
- "fd" คืนค่า "RawFD" แทน "Int"
- แพ็คเกจ JuliaSyntaxHighlighting
- แพ็คเกจมาตรฐานใหม่สำหรับใช้การเน้นไวยากรณ์กับโค้ด Julia โดยใช้ JuliaSyntax และ StyledStrings เพื่อนำฟังก์ชันเน้นไวยากรณ์ไปใช้งาน ซึ่งจะสร้าง AnnotatedString โดยใช้การเน้นไวยากรณ์นั้น
- แพ็กเกจ LinearAlgebra
- ตอนนี้ "อันดับ" สามารถรับเมทริกซ์ "QRPivoted" เพื่อประมาณอันดับผ่านการแยกตัวประกอบ QR ได้
- เพิ่มพารามิเตอร์คีย์ "alg" ให้กับ "eigen", "eigen!", "eigvals" และ "eigvals!" สำหรับประเภทเมทริกซ์ self-adjoint (union ทั่วไปคือ "RealHermSymComplexHerm") ช่วยให้สามารถสลับระหว่างอัลกอริทึมการแยกค่าลักษณะเฉพาะที่แตกต่างกันได้
- เพิ่มเวอร์ชันทั่วไปของการแยกส่วน Cholesky ที่ไม่ถูกบล็อกด้วยการสุ่มตัวอย่างการหมุน (เรียกผ่าน "cholesky[!](A, RowMaximum())")
- จำนวนเธรด BLAS เริ่มต้นจะคำนึงถึงความสัมพันธ์ของกระบวนการแทนที่จะคำนึงถึงเพียงจำนวนเธรดลอจิกในระบบเท่านั้น
- เพิ่มฟังก์ชัน "zeroslike" ซึ่งส่งคืนองค์ประกอบศูนย์สำหรับเมทริกซ์แบบเทป ประเภทอาร์เรย์แบบกำหนดเองสามารถใช้ฟังก์ชันนี้เฉพาะเพื่อส่งคืนผลลัพธ์ที่ถูกต้องได้
- การคูณเมทริกซ์ "A * B" ตอนนี้เรียกใช้ "matprod_dest(A, B, T::Type)" เพื่อสร้างปลายทาง ฟังก์ชันนี้เปิดให้ใช้งานสาธารณะแล้ว
- ฟังก์ชัน "haszero(T::Type)" ใช้เพื่อตรวจสอบว่าประเภท "T" มีองค์ประกอบศูนย์ที่ไม่ซ้ำกัน ซึ่งกำหนดเป็น "zero(T)" หรือไม่ ปัจจุบันฟังก์ชันนี้เปิดให้ใช้งานสาธารณะแล้ว
- เพิ่มฟังก์ชัน "diagview" ซึ่งจะส่งคืนมุมมองของเส้นทแยงมุมที่เฉพาะเจาะจงของเมทริกซ์ "AbstractMatrix"
- แพ็คเกจโปรไฟล์
- "Profile.take_heap_snapshot" ตอนนี้ยอมรับพารามิเตอร์ใหม่ "redact_data::Bool" ซึ่งมีค่าเริ่มต้นเป็น "true" หากเปิดใช้งาน เนื้อหาของวัตถุ Julia (เช่น สตริง) จะไม่รวมอยู่ในสแนปช็อตฮีป
- ตอนนี้ "Profile.print()" จะระบายสีโมดูล Base/Core/Package ในลักษณะเดียวกับที่ทำใน stack trace และเส้นทาง (แม้แต่เส้นทางที่ถูกตัดทอน) สามารถคลิกได้ในเทอร์มินัลที่รองรับลิงก์ URI และอนุญาตให้เปิดไฟล์และบรรทัดที่ระบุในตัวแก้ไขที่ระบุโดย "JULIA_EDITOR"
- ตัวแทน
- การใช้ฟีเจอร์ใหม่ "usings=true" ในฟังก์ชัน "names()" ทำให้การเติมข้อความ REPL สามารถทำให้ชื่อที่มองเห็นได้ผ่าน "using" สมบูรณ์ได้
- การเติมข้อมูล REPL สามารถทำให้สตริงสมบูรณ์ได้ เช่น "[import|using] Mod: xxx|" เช่น การเติมข้อมูล "using Base.Experimental: @op" เป็น "using Base.Experimental: @opaque"
- ขณะนี้ REPL จะแสดงคำเตือนหากมีการอ้างอิงชื่อผ่านโมดูลที่ไม่ได้กำหนดชื่อนั้น (และไม่มีซับโมดูลที่กำหนดชื่อนั้น) และชื่อนั้นไม่ได้เปิดเผยต่อสาธารณะในโมดูลนั้น ตัวอย่างเช่น มีการกำหนด "map" ไว้ใน Base และเมื่อรัน "LinearAlgebra.map" ใน REPL จะแสดงคำเตือนในครั้งแรกที่มีการอ้างอิงดังกล่าว
- เมื่อส่งออกอินพุตไปยัง REPL เอาต์พุตจะถูกตัดเหลือ 20 KiB การเปลี่ยนแปลงนี้ไม่ส่งผลต่อการเรียกใช้งาน "show", "print" ฯลฯ ด้วยตนเอง
- การเติมคำอัตโนมัติสำหรับอักขระ "\" ตอนนี้จะแสดงอักขระหรืออิโมจิที่สอดคล้องกันถัดจากคำรหัสที่ตรงกันแต่ละคำ
- แพ็คเกจทดสอบ
- หากชุดทดสอบ DefaultTestSet ล้มเหลว ตัวสร้างตัวเลขสุ่ม (RNG) ของชุดทดสอบจะถูกพิมพ์ออกมาเพื่อช่วยสร้างข้อผิดพลาดสุ่มที่ขึ้นอยู่กับสถานะ RNG เท่านั้น คุณยังสามารถระบุ RNG สำหรับชุดทดสอบได้โดยการส่งพารามิเตอร์ rng ไปยังแมโคร @testset: julia using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
- แพ็คเกจ InteractiveUtils
- แมโครใหม่ "@trace_compile" และ "@trace_dispatch" สำหรับการดำเนินการนิพจน์ที่มีพารามิเตอร์ "--trace-compile=stderr --trace-compile-timing" และ "--trace-dispatch=stderr" ตามลำดับ
- การพึ่งพาภายนอก
- ขณะนี้ฐานข้อมูลข้อมูลเทอร์มินัล ("terminfo") ถูกเพิ่มเข้ามาใน Julia ตามค่าเริ่มต้น ซึ่งช่วยเพิ่มประสิทธิภาพการทำงานของ REPL เมื่อไม่สามารถใช้ terminfo ในระบบได้ คุณสามารถสร้าง Julia ได้โดยไม่ต้องรวมฐานข้อมูล โดยใช้พารามิเตอร์ Makefile "WITH_TERMINFO=0"
- การปรับปรุงเครื่องมือ
- มีโปรไฟเลอร์แบบ Wall-time สำหรับผู้ใช้ที่ต้องการโปรไฟเลอร์สุ่มตัวอย่างที่บันทึกงานโดยไม่คำนึงถึงสถานะ (กำหนดเวลา/กำลังทำงาน) โปรไฟเลอร์นี้ช่วยให้สามารถจัดทำโปรไฟล์งานที่ใช้ I/O จำนวนมาก และช่วยระบุพื้นที่ที่มีการแข่งขันสูงในระบบ
ที่มา: opennet.ru
