guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 09/11: Special case for array-map! with three arguments


From: Daniel Llorens
Subject: [Guile-commits] 09/11: Special case for array-map! with three arguments
Date: Wed, 16 Nov 2016 19:26:18 +0000 (UTC)

lloda pushed a commit to branch lloda-squash0
in repository guile.

commit 07da06585f5409a581790fa758072abae4b5e399
Author: Daniel Llorens <address@hidden>
Date:   Wed Dec 9 13:10:48 2015 +0100

    Special case for array-map! with three arguments
    
    Benchmark:
    
    (define type #t)
    (define A (make-typed-array 's32 0 10000 1000))
    (define B (make-typed-array 's32 0 10000 1000))
    (define C (make-typed-array 's32 0 10000 1000))
    
    before:
    
    scheme@(guile-user)> ,time (array-map! C + A B)
    ;; 0.792653s real time, 0.790970s run time.  0.000000s spent in GC.
    
    after:
    
    scheme@(guile-user)> ,time (array-map! C + A B)
    ;; 0.598513s real time, 0.597146s run time.  0.000000s spent in GC.
    
    * libguile/array-map.c (ramap): Add special case with 3 arguments.
---
 libguile/array-map.c |   60 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 38 insertions(+), 22 deletions(-)

diff --git a/libguile/array-map.c b/libguile/array-map.c
index 9caded8..01bebb8 100644
--- a/libguile/array-map.c
+++ b/libguile/array-map.c
@@ -322,32 +322,48 @@ ramap (SCM ra0, SCM proc, SCM ras)
           h0.vset (h0.vector, i0, scm_call_1 (proc, h1.vref (h1.vector, i1)));
       else
         {
-          scm_t_array_handle *hs;
-          size_t restn = scm_ilength (ras);
-
-          SCM args = SCM_EOL;
-          SCM *p = &args;
-          SCM **sa = scm_gc_malloc (sizeof(SCM *) * restn, vi_gc_hint);
-          for (size_t k = 0; k < restn; ++k)
+          SCM ra2 = SCM_CAR (ras);
+          size_t i2 = SCM_I_ARRAY_BASE (ra2);
+          ssize_t inc2 = SCM_I_ARRAY_DIMS (ra2)->inc;
+          scm_t_array_handle h2;
+          ra2 = SCM_I_ARRAY_V (ra2);
+          scm_array_get_handle (ra2, &h2);
+          ras = SCM_CDR (ras);
+          if (scm_is_null (ras))
+            for (; n--; i0 += inc0, i1 += inc1, i2 += inc2)
+              h0.vset (h0.vector, i0, scm_call_2 (proc, h1.vref (h1.vector, 
i1), h2.vref (h2.vector, i2)));
+          else
             {
-              *p = scm_cons (SCM_UNSPECIFIED, SCM_EOL);
-              sa[k] = SCM_CARLOC (*p);
-              p = SCM_CDRLOC (*p);
-            }
+              scm_t_array_handle *hs;
+              size_t restn = scm_ilength (ras);
+              SCM args = SCM_EOL;
+              SCM *p = &args;
+              SCM **sa = scm_gc_malloc (sizeof(SCM *) * restn, vi_gc_hint);
+              size_t k;
+              ssize_t i;
+              
+              for (k = 0; k < restn; ++k)
+                {
+                  *p = scm_cons (SCM_UNSPECIFIED, SCM_EOL);
+                  sa[k] = SCM_CARLOC (*p);
+                  p = SCM_CDRLOC (*p);
+                }
 
-          hs = scm_gc_malloc (sizeof(scm_t_array_handle) * restn, vi_gc_hint);
-          for (size_t k = 0; k < restn; ++k, ras = scm_cdr (ras))
-            scm_array_get_handle (scm_car (ras), hs+k);
+              hs = scm_gc_malloc (sizeof(scm_t_array_handle) * restn, 
vi_gc_hint);
+              for (k = 0; k < restn; ++k, ras = scm_cdr (ras))
+                scm_array_get_handle (scm_car (ras), hs+k);
 
-          for (ssize_t i = 0; n--; i0 += inc0, i1 += inc1, ++i)
-            {
-              for (size_t k = 0; k < restn; ++k)
-                *(sa[k]) = scm_array_handle_ref (hs+k, i*hs[k].dims[0].inc);
-              h0.vset (h0.vector, i0, scm_apply_1 (proc, h1.vref (h1.vector, 
i1), args));
-            }
+              for (i = 0; n--; i0 += inc0, i1 += inc1, i2 += inc2, ++i)
+                {
+                  for (k = 0; k < restn; ++k)
+                    *(sa[k]) = scm_array_handle_ref (hs+k, 
i*hs[k].dims[0].inc);
+                  h0.vset (h0.vector, i0, scm_apply_2 (proc, h1.vref 
(h1.vector, i1), h2.vref (h2.vector, i2), args));
+                }
 
-          for (size_t k = 0; k < restn; ++k)
-            scm_array_handle_release (hs+k);
+              for (k = 0; k < restn; ++k)
+                scm_array_handle_release (hs+k);
+            }
+          scm_array_handle_release (&h2);
         }
       scm_array_handle_release (&h1);
     }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]