私はubuntu、64ビットを実行しています。私はこれらのことを行う方法を学ぶために作ったこの最小限のテストパッケージを持っています(私はパッケージにいくつかのcコードもあることを除いて、このチュートリアルに従っています)。
パッケージはLinuxでビルド/実行されるので、Windowsでも実行するように設定しました。
私はこの回答に従い、Uwe Liggesが管理しているオンラインのWindowsパッケージビルダーを使用して、パッケージの(動作する)zipバージョンを取得しました。
さて、その.zipパッケージをWindows(7-64)にインストールすると、小さなデモコードの実行がLinuxバージョンよりも遅くなります。30倍遅いように。違いがいつもこんなに大きいのではないかと思います。何が間違っているのか、どうすればこのギャップを修正できるのか疑問に思っています。
編集:
これはソースコードです(これは最小限の作業例です):
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <fstream>
#include <iostream>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <Eigen/SVD>
using namespace std;
using namespace Eigen;
using Eigen::MatrixXf;
using Eigen::VectorXf;
float median(VectorXf& x) {
int n=x.rows();
int half=(n+1)/2;
half--;
float med;
nth_element(x.data(),x.data()+half,x.data()+x.size());
if((n%2)==1){
med=x(half);
} else {
float tmp0=x(half);
float tmp1=x.segment(half+1,half-1).minCoeff();
med=0.5*(tmp0+tmp1);
}
return med;
}
VectorXf fx01(MatrixXf& x){
int p=x.cols();
int n=x.rows();
VectorXf Recept(n);
VectorXf Result(p);
for(int i=0;i<p;i++){
Recept=x.col(i);
Result(i)=median(Recept);
}
return Result;
}
extern "C"{
void mse(int* n,int* p,float* x,float* medsout){
MatrixXf x_cen=Map<MatrixXf>(x,*n,*p);
VectorXf MedsOut=fx01(x_cen);
Map<VectorXf>(medsout,*p)=MedsOut.array();
}
}
EDIT2:
cbeleitesの提案に従って、コードを複数回実行しました。これを行うと、奇妙なことがわかりました。関数を呼び出す前に呼び出す場合を除いて、関数のタイミングは実際にはLinuxと同じapply()
です。つまり、パックが計算するcolwise中央値のタイミングを実行するタイミングと常に比較していましたapply(X,2,median)
。
わかりました、問題は解決しました。今のところ。それでも私は今興味があります:(apply()
巨大なマトリックスX上で)古き良き時代の呼び出しが物事をそれほどひどく破壊するのはなぜですか(system.timeは90秒から3秒になりました)?