 <p>I disagree with the previous post. This is not a threading issue, this is an algorithm issue. The reason matlab, R, and octave wipe the floor with C++ libraries is because their C++ libraries use more complex, better algorithms. If you read the octave page you can find out what <em>they</em> do[1]: </p> <blockquote> <p>Eigenvalues are computed in a several step process which begins with a Hessenberg decomposition, followed by a Schur decomposition, from which the eigenvalues are apparent. The eigenvectors, when desired, are computed by further manipulations of the Schur decomposition.</p> </blockquote> <p>Solving eigenvalue/eigenvector problems is non-trivial. In fact its one of the few things "Numerical Recipes in C" recommends you <em>don't</em> implement yourself. (p461). GSL is often slow, which was my initial response. ALGLIB is also slow for its standard implementation (I'm getting about 12 seconds!):</p> <pre><code>#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;ctime&gt; #include &lt;linalg.h&gt; using std::cout; using std::setw; using std::endl; const int VERBOSE = false; int main(int argc, char** argv) { int size = 0; if(argc != 2) { cout &lt;&lt; "Please provide a size of input" &lt;&lt; endl; return -1; } else { size = atoi(argv[1]); cout &lt;&lt; "Array Size: " &lt;&lt; size &lt;&lt; endl; } alglib::real_2d_array mat; alglib::hqrndstate state; alglib::hqrndrandomize(state); mat.setlength(size, size); for(int rr = 0 ; rr &lt; mat.rows(); rr++) { for(int cc = 0 ; cc &lt; mat.cols(); cc++) { mat[rr][cc] = mat[cc][rr] = alglib::hqrndnormal(state); } } if(VERBOSE) { cout &lt;&lt; "Matrix: " &lt;&lt; endl; for(int rr = 0 ; rr &lt; mat.rows(); rr++) { for(int cc = 0 ; cc &lt; mat.cols(); cc++) { cout &lt;&lt; setw(10) &lt;&lt; mat[rr][cc]; } cout &lt;&lt; endl; } cout &lt;&lt; endl; } alglib::real_1d_array d; alglib::real_2d_array z; auto t = clock(); alglib::smatrixevd(mat, mat.rows(), 1, 0, d, z); t = clock() - t; cout &lt;&lt; (double)t/CLOCKS_PER_SEC &lt;&lt; "s" &lt;&lt; endl; if(VERBOSE) { for(int cc = 0 ; cc &lt; mat.cols(); cc++) { cout &lt;&lt; "lambda: " &lt;&lt; d[cc] &lt;&lt; endl; cout &lt;&lt; "V: "; for(int rr = 0 ; rr &lt; mat.rows(); rr++) { cout &lt;&lt; setw(10) &lt;&lt; z[rr][cc]; } cout &lt;&lt; endl; } } } </code></pre> <p>If you really need a fast library, probably need to do some real hunting. </p> <p>[1] <a href="http://www.gnu.org/software/octave/doc/interpreter/Basic-Matrix-Functions.html">http://www.gnu.org/software/octave/doc/interpreter/Basic-Matrix-Functions.html</a></p>