ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.c
(Generate patch)

Comparing libev/ev.c (file contents):
Revision 1.235 by root, Wed May 7 14:45:17 2008 UTC vs.
Revision 1.240 by root, Thu May 8 21:21:41 2008 UTC

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#if USE_4HEAP 771#if USE_4HEAP
772 772
773#define DHEAP 4
773#define HEAP0 3 /* index of first element in heap */ 774#define HEAP0 (DHEAP - 1) /* index of first element in heap */
774 775
775/* towards the root */ 776/* towards the root */
776void inline_speed 777void inline_speed
777upheap (WT *heap, int k) 778upheap (WT *heap, int k)
778{ 779{
779 WT w = heap [k]; 780 WT w = heap [k];
781 ev_tstamp w_at = w->at;
780 782
781 for (;;) 783 for (;;)
782 { 784 {
783 int p = ((k - HEAP0 - 1) / 4) + HEAP0; 785 int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0;
784 786
785 if (p >= HEAP0 || heap [p]->at <= w->at) 787 if (p == k || heap [p]->at <= w_at)
786 break; 788 break;
787 789
788 heap [k] = heap [p]; 790 heap [k] = heap [p];
789 ev_active (heap [k]) = k; 791 ev_active (heap [k]) = k;
790 k = p; 792 k = p;
803 805
804 for (;;) 806 for (;;)
805 { 807 {
806 ev_tstamp minat; 808 ev_tstamp minat;
807 WT *minpos; 809 WT *minpos;
808 WT *pos = heap + 4 * (k - HEAP0) + HEAP0; 810 WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0;
809 811
810 // find minimum child 812 // find minimum child
811 if (expect_true (pos +3 < E)) 813 if (expect_true (pos + DHEAP - 1 < E))
812 { 814 {
813 (minpos = pos + 0), (minat = (*minpos)->at); 815 /* fast path */ (minpos = pos + 0), (minat = (*minpos)->at);
814 if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); 816 if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at);
815 if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); 817 if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at);
816 if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); 818 if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at);
817 } 819 }
818 else 820 else if (pos < E)
819 { 821 {
820 if (pos >= E)
821 break;
822
823 (minpos = pos + 0), (minat = (*minpos)->at); 822 /* slow path */ (minpos = pos + 0), (minat = (*minpos)->at);
824 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);
825 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);
826 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);
827 } 826 }
827 else
828 break;
828 829
829 if (w->at <= minat) 830 if (w->at <= minat)
830 break; 831 break;
831 832
832 ev_active (*minpos) = k; 833 ev_active (*minpos) = k;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines