$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: tknapen (toon.knapen_at_[hidden])
Date: 2001-12-21 03:42:33
--- In boost_at_y..., Ron Garcia <garcia_at_c...> wrote:
> Hi,
> 
> I have uploaded a library called multi_array to the files directory.  
2 questions:
1) performance
Have you measered performance compared to plain C-arrays ?
I just wrote a small test in 2 minutes and have some strange results.
The C-array indexing takes 0.9 seconds where-as the multi-array takes
2.92 seconds. (see below for small test program). Can this be due to
the []-indexing.
2) subviews with other value_type
Apparantly, when creating a sub-view, the value_type is automatically
the same as the value_type of the original matrix. Is it possible to
take e.g. a double-view on a complex matrix ?
----------------------
#include "boost/multi_array.hpp"
#include <boost/timer.hpp>
#include <iostream>
#include <cassert>
static const int size = 100;
int 
ma () {
  typedef boost::multi_array<double, 3> array;
  array A(boost::extents[size][size][size]);
  // Assign values to the elements
  int values = 0;
  for(array::index i = 0; i != size; ++i) 
    for(array::index j = 0; j != size; ++j)
      for(array::index k = 0; k != size; ++k)
        A[i][j][k] = values++;
  // Verify values
  int verify = 0;
  for(array::index i = 0; i != size; ++i) 
    for(array::index j = 0; j != size; ++j)
      for(array::index k = 0; k != size; ++k)
        assert(A[i][j][k] == verify++);
  return 0;
}
int ca()
{
  double A[size*size*size];
  
  // Assign values to the elements
  int values = 0;
  for(int i = 0; i != size; ++i) 
    for(int j = 0; j != size; ++j)
      for(int k = 0; k != size; ++k)
        A[(((i*size)+j)*size)+k] = values++;
  // Verify values
  int verify = 0;
  for(int i = 0; i != size; ++i) 
    for(int j = 0; j != size; ++j)
      for(int k = 0; k != size; ++k)
        assert( A[(((i*size)+j)*size)+k] == verify++ );
  return 0;
}
int main()
{
  boost::timer t;
  for(int i = 0; i < 10 ; ++i ) ca();
  std::cout << t.elapsed() << std::endl;
  t.restart();
  for(int i = 0; i < 10 ; ++i ) ma();
  std::cout << t.elapsed() << std::endl;
  t.restart();
  for(int i = 0; i < 10 ; ++i ) ca();
  std::cout << t.elapsed() << std::endl;
  return 0;
}