put หรือ putchar ดีกว่าสำหรับการพิมพ์เพียงขึ้นบรรทัดใหม่หรือไม่

ข้อไหนดีกว่า (ทั้งในด้านประสิทธิภาพและแนวทางปฏิบัติที่ดีที่สุด) สำหรับการพิมพ์ เฉพาะ ขึ้นบรรทัดใหม่:

putchar('\n') or puts("")

จากสิ่งที่ฉันเข้าใจ putchar ส่งออกอักขระตัวเดียวและ puts ส่งออกสตริงอักขระ ลืมเกี่ยวกับ printf ไปได้เลย

ฉันอยากจะใช้ puts เพราะมันสั้นกว่า แต่การทำ ("") แค่รู้สึกผิด

อันไหนเร็วกว่าและดีกว่า?


person Insane    schedule 14.01.2016    source แหล่งที่มา
comment
ดังนั้น... fputc ไม่ควรอยู่ในรายการตัวเลือกนั้นหรือเพียงแค่ putc? อาจรวมทั้งหมดไว้ด้วย (putchar เทียบเท่ากับ putc(ch,stdout))   -  person WhozCraig    schedule 14.01.2016
comment
โดยส่วนตัวแล้ว ฉันชอบ putchar('\n') แต่ฉันไม่มีเหตุผลที่ดีนัก เพียงว่าฉันไม่ชอบ puts เนื่องจากพฤติกรรมที่ไม่สอดคล้องกันในการเพิ่มบรรทัดใหม่ต่อท้ายในขณะที่ fputs ไม่ไม่ชอบ   -  person 5gon12eder    schedule 14.01.2016
comment
คุณกังวลเกี่ยวกับ ประสิทธิภาพ ของคอนโซลบัฟเฟอร์ที่มนุษย์จะอ่านหรือไม่? ถ้าฉันบอกคุณว่าหนึ่งในนั้นเร็วกว่าอีก 8 ไมโครวินาที นั่นจะเป็นเหตุผลที่คุณควรเลือกอันที่ทำหน้าที่ขึ้นบรรทัดใหม่ให้กับสายตาที่รอคอยของคุณเร็วกว่ามากหรือไม่   -  person Eric Lippert    schedule 14.01.2016
comment
ประวัติโดยย่อ. แต่ฉันสงสัยอย่างยิ่งว่ามาโครที่มีวัตถุประสงค์เพียงอย่างเดียวคือการเขียนอักขระตัวเดียวจะดีกว่า (หากเพียงเล็กน้อยเท่านั้น) มากกว่าฟังก์ชันวัตถุประสงค์ทั่วไป แน่นอน หากคุณเพิ่งใช้ puts ก่อนหน้านี้ การแคชจะเข้ามามีบทบาท โค้ดร้อนน่าจะเร็วกว่าโค้ดเย็นแม้ว่าโค้ดร้อนจะต้องดำเนินการตามคำแนะนำเพิ่มเติมอีกสองสามข้อก็ตาม   -  person ShadowRanger    schedule 14.01.2016
comment
@EricLippert ไม่กังวลเกี่ยวกับมันอยากรู้อยากเห็นเกี่ยวกับมัน   -  person Insane    schedule 14.01.2016


คำตอบ (4)


ความแตกต่างของความเร็วระหว่างกันนั้นไม่มีนัยสำคัญ แต่ putchar อาจจะเร็วกว่าเพราะต้องใช้อาร์กิวเมนต์อักขระตัวเดียว

ที่สำคัญกว่านั้นคือ putchar('\n') กำลังพูดในสิ่งที่คุณหมายถึง ในขณะที่ puts("") ไม่ใช่

person hobbs    schedule 14.01.2016

ตามทฤษฎีแล้ว สิ่งหนึ่งต้องใช้ตัวชี้ และไบต์เพิ่มเติม ส่วนอีกไบต์ไม่ต้องการ เช่นกัน เราอาจต้องการคำแนะนำเพิ่มเติมและอาจส่งผลให้ i-cache บางส่วนเสียหาย ซึ่งอาจส่งผลเสีย ในทางปฏิบัติความแตกต่างระหว่างทั้งสองนั้นแทบไม่มีนัยสำคัญเลย

อย่างไรก็ตาม ฉันยังคงใช้ putc หรือ putchar เป็นการส่วนตัวเพียงเพราะว่าโค้ดนั้นง่ายกว่าสำหรับทุกคนที่จะอ่านและทำความเข้าใจ

person Jason    schedule 14.01.2016

คอมไพเลอร์ที่ดีจะปล่อยโค้ดที่ได้รับการปรับปรุงแบบเดียวกันสำหรับด้านล่าง ดังนั้นจึงไม่ใช่ปัญหาด้านประสิทธิภาพ

putchar('\n');
puts("");

ใช้อันที่สื่อถึงจุดประสงค์ของโค้ดได้ดีกว่า ซึ่งมักขึ้นอยู่กับสิ่งอื่นที่กำลังพิมพ์อยู่

// Example 1
putchar('(');
putchar(ch);
putchar(')');

putchar('\n');  // Better choice
// puts("");


// Example 2
puts(name);
puts(rank);
puts(serial_number);

// putchar('\n');  
puts(""); // Better choice
person chux - Reinstate Monica    schedule 14.01.2016

แม้ว่า put() จะอนุญาตให้คุณส่งออกสตริงได้ แต่คุณกำลังส่งออกสตริงที่มีอักขระเพียงตัวเดียว (ขึ้นบรรทัดใหม่) ดังนั้นผลลัพธ์และประสิทธิภาพจึงควรเหมือนกับการใช้ putchar()

person user4982357    schedule 14.01.2016