annotate tango-0.99.9.patch @ 1633:5c0cebff9be8

Improve array append performance. Actually use the appropriate runtime function, instead of just growing the array by one!
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Feb 2010 10:11:05 +0100
parents
children 40bd4a0d4870
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1633
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
1 Index: tango/core/rt/compiler/ldc/rt/lifetime.d
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
2 ===================================================================
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
3 --- tango/core/rt/compiler/ldc/rt/lifetime.d (revision 5368)
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
4 +++ tango/core/rt/compiler/ldc/rt/lifetime.d (working copy)
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
5 @@ -786,6 +786,7 @@
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
6 return *cast(long*)px;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
7 }
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
8
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
9 ++/
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
10
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
11 /**
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
12 *
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
13 @@ -849,10 +850,11 @@
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
14
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
15
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
16 /**
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
17 - *
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
18 + * Appends a single element to an array.
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
19 */
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
20 -extern (C) byte[] _d_arrayappendcT(TypeInfo ti, ref byte[] x, ...)
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
21 +extern (C) byte[] _d_arrayappendcT(TypeInfo ti, void* array, void* element)
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
22 {
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
23 + auto x = cast(byte[]*)array;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
24 auto sizeelem = ti.next.tsize(); // array element size
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
25 auto info = gc_query(x.ptr);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
26 auto length = x.length;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
27 @@ -879,16 +881,16 @@
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
28 assert(newcap >= newlength * sizeelem);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
29 newdata = cast(byte *)gc_malloc(newcap + 1, info.attr);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
30 memcpy(newdata, x.ptr, length * sizeelem);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
31 - (cast(void**)(&x))[1] = newdata;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
32 + (cast(void**)x)[1] = newdata;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
33 }
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
34 L1:
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
35 - byte *argp = cast(byte *)(&ti + 2);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
36 + byte *argp = cast(byte *)element;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
37
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
38 - *cast(size_t *)&x = newlength;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
39 + *cast(size_t *)x = newlength;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
40 x.ptr[length * sizeelem .. newsize] = argp[0 .. sizeelem];
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
41 assert((cast(size_t)x.ptr & 15) == 0);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
42 assert(gc_sizeOf(x.ptr) > x.length * sizeelem);
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
43 - return x;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
44 + return *x;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
45 }
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
46
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
47
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
48 @@ -1128,6 +1130,7 @@
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
49 return result;
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
50 }
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
51
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
52 +/+
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
53
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
54 /**
5c0cebff9be8 Improve array append performance.
Christian Kamm <kamm incasoftware de>
parents:
diff changeset
55 *