mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
This patch results in a 20%-40% speedup in the > 1 argument cases of the following microbenchmarks: (define A (make-shared-array #0(1) (const '()) #e1e7)) ; 1, 2, 3 arguments. (define a 0) ,time (array-for-each (lambda (b) (set! a (+ a b))) A) (define a 0) ,time (array-for-each (lambda (b c) (set! a (+ a b c))) A A) (define a 0) ,time (array-for-each (lambda (b c d) (set! a (+ a b c d))) A A A) (define A (make-shared-array (make-array 1) (const '()) #e1e7)) (define B (make-shared-array #0(1) (const '()) #e1e7)) ; 1, 2, 3 arguments. ,time (array-map! A + B) ,time (array-map! A + B B) ,time (array-map! A + B B B) * libguile/array-map.c (scm_ramap): Note on cproc arguments. (rafill): Assume that dst's lbnd is 0. (racp): Assume that src's lbnd is 0. (ramap): Assume that ra0's lbnd is 0. When there're more than two arguments, compute the array handles before the loop. Allocate the arg list once and reuse it in the loop. (rafe): Do as in ramap(), when there's more than one argument. (AREF, ASET): Remove.
48 lines
1.5 KiB
C
48 lines
1.5 KiB
C
/* classes: h_files */
|
||
|
||
#ifndef SCM_ARRAY_MAP_H
|
||
#define SCM_ARRAY_MAP_H
|
||
|
||
/* Copyright (C) 1995, 1996, 1997, 2000, 2006, 2008, 2009, 2010,
|
||
* 2011, 2013, 2015 Free Software Foundation, Inc.
|
||
*
|
||
* This library is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU Lesser General Public License
|
||
* as published by the Free Software Foundation; either version 3 of
|
||
* the License, or (at your option) any later version.
|
||
*
|
||
* This library is distributed in the hope that it will be useful, but
|
||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* Lesser General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with this library; if not, write to the Free Software
|
||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
* 02110-1301 USA
|
||
*/
|
||
|
||
|
||
|
||
#include "libguile/__scm.h"
|
||
|
||
|
||
|
||
SCM_API int scm_ra_matchp (SCM ra0, SCM ras);
|
||
SCM_API int scm_ramapc (void *cproc, SCM data, SCM ra0, SCM lra,
|
||
const char *what);
|
||
SCM_API SCM scm_array_fill_x (SCM ra, SCM fill);
|
||
SCM_API SCM scm_array_copy_x (SCM src, SCM dst);
|
||
SCM_API SCM scm_array_map_x (SCM ra0, SCM proc, SCM lra);
|
||
SCM_API SCM scm_array_for_each (SCM proc, SCM ra0, SCM lra);
|
||
SCM_API SCM scm_array_index_map_x (SCM ra, SCM proc);
|
||
SCM_API SCM scm_array_equal_p (SCM ra0, SCM ra1);
|
||
SCM_INTERNAL void scm_init_array_map (void);
|
||
|
||
#endif /* SCM_ARRAY_MAP_H */
|
||
|
||
/*
|
||
Local Variables:
|
||
c-file-style: "gnu"
|
||
End:
|
||
*/
|