C # программным образом использует IP-адреса различных сетевых карт, назначенные ПК [duplicate]

Мне было любопытно, есть ли какое-либо измеримое влияние на производительность между различными способами вызова std :: sort, поэтому я создал этот простой тест:

  $ cat sort.cpp  # включают & л; алгоритм & GT;  # Включают & л; iostream & GT;  # Включают & Lt; & вектор GT;  # Включают & л; хроно & GT;  #define COMPILER_BARRIER () asm volatile ("" ::: "memory");  typedef unsigned long int ulint;  использование пространства имен std;  struct S {int x;  int y;  };  #define BODY {return s1.x * s2.y & lt;  s2.x * s1.y;  } bool operator & lt; (const S & amp; s1, const S & amp; s2) BODY bool Sgreater_func (const S & amp; s1, const S & amp; s2) BODY struct Sgreater {bool operator () (const S & amp; s1, const S & amp; s2) const BODY  };  void sort_by_operator (vector & lt; s & amp; v) {sort (v.begin (), v.end ());  } void sort_by_lambda (vector & lt; s & amp; v) {sort (v.begin (), v.end (), [] (const S & amp; s1, const S & amp; s2) BODY);  } void sort_by_functor (vector & lt; s & amp; v) {sort (v.begin (), v.end (), Sgreater ());  } void sort_by_function (vector & lt; s & amp; v) {sort (v.begin (), v.end (), & amp; Sgreater_func);  } const int N = 10000000;  вектор & л, S & GT;  random_vector;  ulint run (void foo (вектор & lt; S & gt; v)) {вектор & lt; S & gt;  TMP (random_vector);  Foo (TMP);  ulint checksum = 0;  for (int i = 0; i & lt; tmp.size (); ++ i) {checksum + = i * tmp [i] .x ^ tmp [i] .y;  } контрольная сумма возврата;  } void measure (void foo (vector & lt; S & gt; & amp; v)) {ulint check_sum = 0;  // разминка const int WARMUP_ROUNDS = 3;  const int TEST_ROUNDS = 10;  for (int t = WARMUP_ROUNDS; t -;) {COMPILER_BARRIER ();  check_sum + = run (foo);  COMPILER_BARRIER ();  } for (int t = TEST_ROUNDS; t -;) {COMPILER_BARRIER ();  auto start = std :: chrono :: high_resolution_clock :: now ();  COMPILER_BARRIER ();  check_sum + = run (foo);  COMPILER_BARRIER ();  auto end = std :: chrono :: high_resolution_clock :: now ();  COMPILER_BARRIER ();  auto duration_ns = std :: chrono :: duration_cast & lt; std :: chrono :: duration & lt; double & gt; gt; (end-start) .count ();  cout & lt;  «Взял» & lt;  duration_ns & lt;  's, чтобы закончить круглый & lt; & lt;  епсИ;  } cout & lt;  "Контрольная сумма:" & lt;  check_sum & lt;  епсИ;  } #define M (x) \ cout & lt;  «Измерение» #x «on» & lt;  N & lt;  "items:" & lt;  endl; \ measure (x);  int main () {random_vector.reserve (N);  for (int i = 0; i & lt; N; ++ i) {random_vector.push_back (S {rand (), rand ()});  } M (sort_by_operator);  М (sort_by_lambda);  М (sort_by_functor);  М (sort_by_function);  return 0;  }  

Что он делает, так это создает случайный вектор, а затем измеряет, сколько времени требуется для его копирования и сортировки его копии (и вычислить некоторую контрольную сумму, чтобы избежать слишком сильного мертвого кода исключение).

Я компилировал с g ++ (GCC) 7.2.1 20170829 (Red Hat 7.2.1-1)

  $ g ++ -O2 -o сортировка сортировки.  cpp & amp; & amp;  ./sort  

Вот результаты:

  Измерение sort_by_operator на 10000000 элементах: Взял 0.994285s, чтобы завершить раунд. Взял 0.990162s, чтобы завершить раунд. Принимал 0.992103s до  полный раунд Взял 0.989638s, чтобы завершить раунд Взял 0.98105s, чтобы завершить раунд Взял 0.991913s, чтобы завершить раунд Взял 0.992176s, чтобы завершить раунд Взял 0.981706s, чтобы завершить раунд Взял 0.99021s, чтобы завершить раунд Взял 0.988841s для завершения раунда Контрольная сумма: 18446656212269526361 Мера sort_by_lambda on  10000000 предметов: Взял 0.974274s, чтобы завершить раунд Взял 0.97298s, чтобы завершить раунд Взял 0.964506s, чтобы завершить раунд Взял 0.96899s, чтобы завершить раунд Взял 0.965773s, чтобы завершить раунд Взял 0.96457s, чтобы завершить раунд Взял 0.974286s, чтобы завершить раунд Взял 0.975524s, чтобы закончить раунд  раунд Взял 0,966238s для завершения раунда Взял 0,964676s для завершения раунда Контрольная сумма: 18446656212269526361 Мера sort_by_functor на 10000000 предметов: Взял 0.964359s, чтобы завершить раунд Взял 0.979619s, чтобы завершить раунд Взял 0.974027s для завершения раунда  Взял 0,964671s, чтобы завершить раунд Взял 0,964764s, чтобы завершить раунд Взял 0,966491s, чтобы завершить раунд Взял 0,964706s, чтобы завершить раунд Взял 0,965115s, чтобы завершить раунд Взял 0,964352s, чтобы завершить раунд Взял 0,968954s для завершения раунда Контрольная сумма: 18446656212269526361 Мера sort_by_function на 10000000 статьях  : Взял 1.29942s, чтобы завершить раунд Взял 1.3029s, чтобы закончить раунд Взял 1.29931s, чтобы закончить раунд Взял 1.29946s, чтобы закончить раунд Взял 1.29837s, чтобы закончить раунд Took 1.30132s, чтобы закончить раунд Взял 1.3023s, чтобы закончить раунд Взял 1.30997s, чтобы закончить раунд Took  1.30819s для завершения раунда Took 1.3003s для завершения раунда Контрольная сумма: 18446656212269526361  

Похоже, что все параметры, кроме указателя функции, очень похожи, а передача указателя функции вызывает + 30% -ный штраф.

Он также выглядит как оператор & lt; версия на ~ 1% медленнее (я повторил тест несколько раз, и эффект сохраняется), что немного странно, поскольку предполагает, что сгенерированный код отличается (мне не хватает навыков для анализа --save-temps output).

7
задан Ramon Snir 1 April 2011 в 15:49
поделиться

1 ответ

Я полагаю, вы можете заставить локальную конечную точку, предоставив BindIPEndPointDelegate , который поставляет IP / порт для привязки.

  строка sendIp = "192.168.0.1"  ;  int sendPort = 5000;  Uri uri = новый Uri ("http://google.com");  HttpWebRequest wr = (HttpWebRequest) WebRequest.Create (uri);  ServicePoint sp = ServicePointManager.FindServicePoint (uri);  sp.BindIPEndPointDelegate = (servicePoint, remoteEp, retryCount) = & gt;  {вернуть новый IPEndPoint (IPAddress.Parse (sendIp), sendPort);  };  var data = new StreamReader (wr.GetResponse (). GetResponseStream ()). ReadToEnd ();   

Этот код не относится к утилизации правильно.

7
ответ дан spender 16 August 2018 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: