Pertanyaan jika, beralih dan perbandingan fungsi pointer kecepatan


Saya membangun interpreter kecil jadi saya ingin menguji seberapa cepat ifs, switch dan pointer ke fungsi, dibandingkan satu sama lain. jika dengan 19 else ifs sedikit lebih cepat daripada switch dengan 20 kasus, dan fungsi pointer (array dari 20 fungsi pointer) jauh lebih lambat dari dua ...

Saya berharap hasilnya benar-benar berlawanan, bisakah seseorang menjelaskannya?


5
2018-02-19 02:13


asal


Jawaban:


Pada prosesor modern, banyak dari ini bermuara pada prediksi cabang. Sementara pernyataan switch dapat diimplementasikan sebagai tabel lompatan yang memakan waktu sekitar waktu yang sama untuk mengeksekusi setiap cabang kode, itu juga umumnya cukup tak terduga - secara harfiah; seorang peramal cabang sering melakukan pekerjaan yang cukup buruk dalam memprediksi cabang mana yang diambil, yang berarti ada peluang yang sangat bagus untuk suatu gelembung pipa (biasanya sekitar 15 siklus yang terbuang atau lebih).

Sebuah pernyataan if dapat melakukan perbandingan lebih banyak, tetapi sebagian besar cabangnya mungkin diambil dengan cara yang sama hampir setiap waktu, sehingga pencetus cabang dapat memprediksi hasil mereka dengan jauh lebih akurat.

Penunjuk ke fungsi juga bisa tidak dapat diprediksi. Lebih buruk lagi, hingga baru-baru ini, sebagian besar prosesor bahkan tidak mencoba. Hanya cukup baru-baru ini melakukan penambahan cukup untuk sebagian besar BTB (Branch Target Buffer) implementasi bahwa mereka benar-benar dapat membuat upaya serius untuk memprediksi target cabang melalui pointer. Pada prosesor yang lebih tua, fungsi pointer sering sangat buruk dalam perbandingan kecepatan.


12
2018-02-19 02:23