C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: C++ algorithm を使って高速化できない?


(過去ログ 76 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■44963 / inTopicNo.1)  C++ algorithm を使って高速化できない?
  
□投稿者/ ふくちゃん (75回)-(2009/12/24(Thu) 10:55:06)

分類:[C/C++] 

part1->pointsは
std::vector<CPoint> points;です。

以下のような形で、ポインタとしてインクリメントしながら、
xValとyValを足しながらpart2のpointsに入れていっているのですが、

pt1 = &part1->points.at(0);
pt2 = &part2->points.at(0);
for ( i = 0; i < size; i++ ) {
pt2->x = pt1->x + xVal;
pt2->y = pt1->y + yVal;

pt1++;
pt2++;
}

これって同じような処理ですから、fill のようなメソッドで
まとめてできないものなのでしょうか?
きっとその方が速そうな気はします。

#include <algorithm>を使用する方法を検討しています。


なにかよいメソッドはありますでしょうか?
引用返信 編集キー/
■44965 / inTopicNo.2)  Re[1]: C++ algorithm を使って高速化できない?
□投稿者/ 774RR (447回)-(2009/12/24(Thu) 11:08:07)
transform
高速化するかどうかは知らない(処理に必要最小限の時間は絶対になくならない)
引用返信 編集キー/
■44967 / inTopicNo.3)  Re[2]: C++ algorithm を使って高速化できない?
□投稿者/ επιστημη (2345回)-(2009/12/24(Thu) 11:26:03)
επιστημη さんの Web サイト
> transform
> 高速化するかどうかは知らない(処理に必要最小限の時間は絶対になくならない)

御意。楽になるだろけど、速くなるかは別問題。少なくとも時間計算量はO(N)のまま。

#include <iostream>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>

using namespace std;
typedef std::pair<int,int> point;

int main() {
  vector<point> src;
  src.push_back(point(0,1));
  src.push_back(point(2,3));
  src.push_back(point(4,5));
  src.push_back(point(6,7));
  int xbias = 10;
  int ybias = 20;
  vector<point> dst;
  // xbias, ybias を加えた point を dstに。
  transform(src.begin(), src.end(), back_inserter(dst),
            [=](const point& p) { return point(p.first+xbias, p.second+ybias); });
  for_each(dst.begin(), dst.end(), 
            [](const point& p) { cout << '(' << p.first << ',' << p.second << ')' << endl;});
}

引用返信 編集キー/
■44972 / inTopicNo.4)  Re[3]: C++ algorithm を使って高速化できない?
□投稿者/ επιστημη (2347回)-(2009/12/24(Thu) 11:55:45)
επιστημη さんの Web サイト
↓ CPUコアが複数個あれば速くなりますがー

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <ppl.h> // Parallel Patterns Library comes with VC++10.0

using namespace std;
typedef std::pair<int,int> point;

int main() {
  const int N = 100;
  vector<point> src(N);
  for ( int i = 0; i < N; ++i ) src[i] = point(i,-i);
  int xbias = 10;
  int ybias = 20;
  vector<point> dst(N);;
  Concurrency::parallel_for(vector<point>::size_type(0), src.size(),
            [&](int i) { dst[i] = point(src[i].first+xbias, src[i].second+ybias); });
  for_each(dst.begin(), dst.end(), 
            [](const point& p) { cout << '(' << p.first << ',' << p.second << ')' << endl;});
}

引用返信 編集キー/
■44980 / inTopicNo.5)  Re[4]: C++ algorithm を使って高速化できない?
□投稿者/ ふくちゃん (76回)-(2009/12/24(Thu) 12:50:34)
なるほど。

いろいろな書き方があるんですね。

transformのサンプル
CPU2つ使用のサンプル

ありがとうございます。
実際にやってみますね^^

ただご意見として上がってることを考慮しますと、
もう少し別のところを重点的に高速化したほうがよさそうですね。
もう少し練ってみます。

ありがとうございました。


No44972 (επιστημη さん) に返信
> ↓ CPUコアが複数個あれば速くなりますがー
>
> #include <iostream>
> #include <utility>
> #include <vector>
> #include <algorithm>
> #include <ppl.h> // Parallel Patterns Library comes with VC++10.0
>
> using namespace std;
> typedef std::pair<int,int> point;
>
> int main() {
> const int N = 100;
> vector<point> src(N);
> for ( int i = 0; i < N; ++i ) src[i] = point(i,-i);
> int xbias = 10;
> int ybias = 20;
> vector<point> dst(N);;
> Concurrency::parallel_for(vector<point>::size_type(0), src.size(),
> [&](int i) { dst[i] = point(src[i].first+xbias, src[i].second+ybias); });
> for_each(dst.begin(), dst.end(),
> [](const point& p) { cout << '(' << p.first << ',' << p.second << ')' << endl;});
> }
>
解決済み
引用返信 編集キー/
■44981 / inTopicNo.6)  Re[5]: C++ algorithm を使って高速化できない?
□投稿者/ 774RR (448回)-(2009/12/24(Thu) 13:01:40)
80:20 の法則とかパレートの法則とか言われている話がある。
すでに速い箇所をさらに速くしてもトータルの処理時間はまったく変化しないわけで、
高速化のためにはまず測定から。

ちなみにえぴ氏提示のサンプルは C++ の次世代規格で導入予定の新機能を使っているので
現在普及しているコンパイラではまずコンパイルできないからそのつもりで。
引用返信 編集キー/
■44984 / inTopicNo.7)  Re[6]: C++ algorithm を使って高速化できない?
□投稿者/ επιστημη (2350回)-(2009/12/24(Thu) 13:14:00)
επιστημη さんの Web サイト
2009/12/24(Thu) 15:37:21 編集(投稿者)

> CPU2つ使用のサンプル

ふたつに限られたもんじゃねぇです。
コア数に応じて適切な数のスレッドが割り当てられ、同時並行処理が行われます。

> 高速化のためにはまず測定から。

いやまったく。103秒が102.9812秒になっても誰一人嬉しくねぇ。

> ちなみにえぴ氏提示のサンプルは C++ の次世代規格で導入予定の新機能を使っているので
> 現在普及しているコンパイラではまずコンパイルできないからそのつもりで。

ふぉろーさんくすです。
Visual Studio 2010β2 で書きますたー

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -