… | |
… | |
766 | * a small-code-size 2-heap one and a ~1.5kb larger 4-heap |
766 | * a small-code-size 2-heap one and a ~1.5kb larger 4-heap |
767 | * which is more cache-efficient. |
767 | * which is more cache-efficient. |
768 | * the difference is about 5% with 50000+ watchers. |
768 | * the difference is about 5% with 50000+ watchers. |
769 | */ |
769 | */ |
770 | #define USE_4HEAP !EV_MINIMAL |
770 | #define USE_4HEAP !EV_MINIMAL |
771 | #define USE_4HEAP 1/* they do not work corretcly */ |
|
|
772 | #if USE_4HEAP |
771 | #if USE_4HEAP |
773 | |
772 | |
774 | #define DHEAP 4 |
773 | #define DHEAP 4 |
775 | #define HEAP0 (DHEAP - 1) /* index of first element in heap */ |
774 | #define HEAP0 (DHEAP - 1) /* index of first element in heap */ |
776 | |
775 | |
777 | /* towards the root */ |
776 | /* towards the root */ |
778 | void inline_speed |
777 | void inline_speed |
779 | upheap (WT *heap, int k) |
778 | upheap (WT *heap, int k) |
780 | { |
779 | { |
781 | WT w = heap [k]; |
780 | WT w = heap [k]; |
|
|
781 | ev_tstamp w_at = w->at; |
782 | |
782 | |
783 | for (;;) |
783 | for (;;) |
784 | { |
784 | { |
785 | int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0; |
785 | int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0; |
786 | |
786 | |
787 | if (p == k || heap [p]->at <= w->at) |
787 | if (p == k || heap [p]->at <= w_at) |
788 | break; |
788 | break; |
789 | |
789 | |
790 | heap [k] = heap [p]; |
790 | heap [k] = heap [p]; |
791 | ev_active (heap [k]) = k; |
791 | ev_active (heap [k]) = k; |
792 | k = p; |
792 | k = p; |
… | |
… | |
810 | WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0; |
810 | WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0; |
811 | |
811 | |
812 | // find minimum child |
812 | // find minimum child |
813 | if (expect_true (pos + DHEAP - 1 < E)) |
813 | if (expect_true (pos + DHEAP - 1 < E)) |
814 | { |
814 | { |
815 | /* fast path */ |
|
|
816 | (minpos = pos + 0), (minat = (*minpos)->at); |
815 | /* fast path */ (minpos = pos + 0), (minat = (*minpos)->at); |
817 | if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); |
816 | if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); |
818 | if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); |
817 | if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); |
819 | if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); |
818 | if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); |
820 | } |
819 | } |
821 | else |
820 | else if (pos < E) |
822 | { |
821 | { |
823 | /* slow path */ |
|
|
824 | if (pos >= E) |
|
|
825 | break; |
|
|
826 | (minpos = pos + 0), (minat = (*minpos)->at); |
822 | /* slow path */ (minpos = pos + 0), (minat = (*minpos)->at); |
827 | if (pos + 1 < E && pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); |
823 | if (pos + 1 < E && pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); |
828 | if (pos + 2 < E && pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); |
824 | if (pos + 2 < E && pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); |
829 | if (pos + 3 < E && pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); |
825 | if (pos + 3 < E && pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); |
830 | } |
826 | } |
|
|
827 | else |
|
|
828 | break; |
831 | |
829 | |
832 | if (w->at <= minat) |
830 | if (w->at <= minat) |
833 | break; |
831 | break; |
834 | |
832 | |
835 | ev_active (*minpos) = k; |
833 | ev_active (*minpos) = k; |