Информация об изменениях

Сообщение Re: [performance] чего-то я не понимаю в этой жизни от 30.06.2022 8:41

Изменено 30.06.2022 8:45 rg45

Re: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, Codealot, Вы писали:

C>
C>    for (auto& cur : vals)
C>    {
C>        auto num = std::stoi(cur);
C>    }
C>

C>
C>        foreach (var val in vals)
C>        {
C>            var num = int.Parse(val);
C>            _hash ^= num.GetHashCode();
C>        }
C>

C>Для тех же данных, код на C++ выполняется за 5.9 секунд и на C# за 1.2 секунды.
C>

Вообще, в таких случаях желательно видеть полные тексты примеров. Какие типы контейнеров и элементов, что и как меряешь и пр.

На моем ноуте картина получается прямо противоположная: на выборке в 10 миллионов элементов C++ — 150 ms, C# — 800 ms и более. Коды примеров ниже:

  C++ (150 ms)
#include <iostream>
#include <vector>
#include <string>
#include <chrono>

std::vector<std::string> MakeIntSequence(int size)
{
   std::vector<std::string> v;
   v.reserve(size);
   for (int i = 0; i < size; ++i)
   {
      v.push_back(std::to_string(i));
   }
   return v;
}

int main()
{
   namespace tm = std::chrono;

   const auto vals = MakeIntSequence(10000000);

   const auto t0 = tm::steady_clock::now();
   int hash{};
   for (auto val : vals)
   {
      hash ^= atoi(val.c_str());
   }
   const auto dt = tm::duration_cast<tm::milliseconds>(tm::steady_clock::now() - t0);

   std::cout << "Processing time: " << dt.count() << "ms" << std::endl;
}


  C# (800 ms)
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var vals = MakeIntSequence(10000000);

            var t0 = DateTime.Now;
            int hash = 0;
            foreach (var val in vals)
            {
                int num = int.Parse(val);
                hash ^= num.GetHashCode();
            }
            var dt = DateTime.Now - t0;
            Console.WriteLine("Processing time: {0}ms", dt.Milliseconds);
        }

        static List<string> MakeIntSequence(int size)
        {
            var vals = new List<string>(size);
            for (int i = 0; i < size; ++i)
            {
                vals.Add(i.ToString());
            }
            return vals;
        }
    }
}


На бОльших выборках C# начинает колбасить не по-детски.
Re: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, Codealot, Вы писали:

C>
C>    for (auto& cur : vals)
C>    {
C>        auto num = std::stoi(cur);
C>    }
C>

C>
C>        foreach (var val in vals)
C>        {
C>            var num = int.Parse(val);
C>            _hash ^= num.GetHashCode();
C>        }
C>

C>Для тех же данных, код на C++ выполняется за 5.9 секунд и на C# за 1.2 секунды.
C>

Вообще, в таких случаях желательно видеть полные тексты примеров. Какие типы контейнеров и элементов, что и как меряешь и пр. И какую конфигурацию ты меряешь — не Debug, случайно?

На моем ноуте картина получается прямо противоположная: на выборке в 10 миллионов элементов C++ — 150 ms, C# — 800 ms и более. Коды примеров ниже:

  C++ (150 ms)
#include <iostream>
#include <vector>
#include <string>
#include <chrono>

std::vector<std::string> MakeIntSequence(int size)
{
   std::vector<std::string> v;
   v.reserve(size);
   for (int i = 0; i < size; ++i)
   {
      v.push_back(std::to_string(i));
   }
   return v;
}

int main()
{
   namespace tm = std::chrono;

   const auto vals = MakeIntSequence(10000000);

   const auto t0 = tm::steady_clock::now();
   int hash{};
   for (auto val : vals)
   {
      hash ^= atoi(val.c_str());
   }
   const auto dt = tm::duration_cast<tm::milliseconds>(tm::steady_clock::now() - t0);

   std::cout << "Processing time: " << dt.count() << "ms" << std::endl;
}


  C# (800 ms)
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var vals = MakeIntSequence(10000000);

            var t0 = DateTime.Now;
            int hash = 0;
            foreach (var val in vals)
            {
                int num = int.Parse(val);
                hash ^= num.GetHashCode();
            }
            var dt = DateTime.Now - t0;
            Console.WriteLine("Processing time: {0}ms", dt.Milliseconds);
        }

        static List<string> MakeIntSequence(int size)
        {
            var vals = new List<string>(size);
            for (int i = 0; i < size; ++i)
            {
                vals.Add(i.ToString());
            }
            return vals;
        }
    }
}


На бОльших выборках C# начинает колбасить не по-детски.