Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
1

C# работает быстрее чем С++

13.11.2014, 11:09. Показов 1935. Ответов 21
Метки нет (Все метки)

имеется файл типа
6
1.0 2.0 3.0 4 5 6 7
1.0 2.0 3.0 4 5 6 7
1.0 2.0 3.0 4 5 6 7
1.0 2.0 3.0 4 5 6 7
1.0 2.0 3.0 4 5 6 7
1.0 2.0 3.0 4 5 6 7

где первая строка, это количество строк, а последующие записаны в формате \double \double \double \int \int \int \int
мне нежно считать весь файл и построчно преобразовать строки в числа.
Написал код на C#, все нормально работает за минуту. Вот пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            StreamReader SR = new StreamReader(@"D:\1.txt");
            string str  = SR.ReadLine();
            double V1,V2,V3;
            int V4,V5,V6,V7;
            
            while(!SR.EndOfStream)
            {
                string [] strArray  = SR.ReadLine().Split(' ');
                V1 = double.Parse(strArray[0], CultureInfo.InvariantCulture.NumberFormat);
                V2 = double.Parse(strArray[1], CultureInfo.InvariantCulture.NumberFormat);
                V3 = double.Parse(strArray[2], CultureInfo.InvariantCulture.NumberFormat);
                V4 = int.Parse(strArray[3]);
                V5 = int.Parse(strArray[4]);
                V6 = int.Parse(strArray[5]);
                V7 = int.Parse(strArray[6]);
            }
            SR.Close();
Предположил что С++ должен работать быстрее и решил реализовать на C++, попытался реализовать несколько способов, но обработка длится не менее 4 минут

Пример кода на C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    const int LENGTH = 256;
    FILE *in;
    char buf[LENGTH]=" ";
    char per[15];
    fopen_s(&in, "D:\\1.txt","rb");
    fgets(buf, LENGTH, in);
    int N = atoi(buf);
    int i = 0; 
    double V1;
    double V2;
    double V3;
    int V4;
    int V5;
    int V6;
    int V7;
    while (i<N)
    {
        fgets(buf, LENGTH, in);
        V1 = atof(strtok(buf, " "));
        V2 = atof(strtok(NULL, " "));
        V3 = atof(strtok(NULL, " "));
        V4 = atoi(strtok(NULL, " "));
        V5 = atoi(strtok(NULL, " "));
        V6 = atoi(strtok(NULL, " "));
        V7 = atoi(strtok(NULL, " "));
        i++;
    }
    fclose(in);
    return 0;
Способы отделения отдельных чисел описывал в
Быстрый сплит

но теперь очень медленно работает atof(), что можно использовать другое...
Или может весь код изменить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2014, 11:09
Ответы с готовыми решениями:

Почему код, написанный на С++, в разы быстрее работает с большим объемом памяти, чем с маленьким?
Привет! Понадобилось мне сравнить скорость работы идентичных алгоритмов на Fortran и C++. Алгоритм...

Быстрее чем цикл
Доброго времени уток дорогие форумчане. Интересует вот какая штуковина, допусти есть программа...

Правда что С быстрее чем С++?
Имеется в виду на исполнении, а не на момент компиляции... Наверняка такая тема уже была, но я не...

Sin быстрее чем из math.h
ребят, вообщем мне задали написать программу которая считала синус быстрее чем из math.h ) скорость...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
21
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
13.11.2014, 11:41 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <fstream>
 
int main()
{
    std::ifstream ifs("FILE.txt");
    
    int fsize;
    ifs >> fsize;
 
    double v1, v2, v3;
    int v4, v5, v6, v7;
 
    for (int i = 0; i < fsize; ++i)
    {
        ifs >> v1 >> v2 >> v3 >> v4 >> v5 >> v6 >> v7;
        std::cout << v1 << ' ' << v2 << ' ' << v3 << ' '
            << v4 << ' ' << v5 << ' ' << v6 << ' ' << v7 << std::endl;
    }
 
    ifs.close();
 
    return 0;
}
явно не 4 минуты
0
2712 / 1879 / 556
Регистрация: 05.06.2014
Сообщений: 5,460
13.11.2014, 11:42 3
Пример кода на C++
Это не плюсы. Попробуйте примерно так:
C++
1
2
3
4
5
6
7
8
9
ifstream stream("1.txt");
int N;
stream>>N;
for(int i=0;i<N;++i)
{
    double V1,V2,V3;
    int V4,V5,V6,V7;
    stream>>V1>>V2>>V3>>V4>>V5>>V6>>V7;
}
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
13.11.2014, 11:54 4
Может даже лучше будет считывать сначала побольше текста в строку, чтобы минимизировать операции с файлом, а уже потом разбивать на части.
0
2712 / 1879 / 556
Регистрация: 05.06.2014
Сообщений: 5,460
13.11.2014, 12:02 5
Цитата Сообщение от Croessmah Посмотреть сообщение
Может даже лучше будет считывать сначала побольше текста в строку, чтобы минимизировать операции с файлом, а уже потом разбивать на части.
На кой черт здесь вообще нужно разбиение чего-то там на части? Программа должна действовать по алгоритму "прочитал циферку, дописал к числу. Прочитал циферку, дописал к числу. Прочитал... А это уже не циферка, а пробел. Стоп машина!". А помнить где это число начинается, где кончается, ей без надобности. Прочитали, вывели на экран (или что там нужно было сделать) и выкинули из головы.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
13.11.2014, 12:10  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
ifstream stream("1.txt");
int N;
stream>>N;
for(int i=0;i<N;++i)
{
    double V1,V2,V3;
    int V4,V5,V6,V7;
    stream>>V1>>V2>>V3>>V4>>V5>>V6>>V7;
}
Работает 10 минут.
У меня около 30 млн значений.
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
13.11.2014, 12:11 7
Renji, затем, что операции с файлами могут хорошенько замедлить процесс считывания, если читать маленькими порциями. Для примера, я на работе делал программу себе для разбора логов. Операция считывания и разбора одного файла занимали около 15 секунд. Решил переделать и считывать большими кусками. Как итог - менее секунды на файл.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
13.11.2014, 12:13  [ТС] 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const int LENGTH = 256;
FILE *in;
char buf[LENGTH]=" ";
char per[15];
fopen_s(&in, "D:\\1.txt","rb");
fgets(buf, LENGTH, in);
int N = atoi(buf);
int i = 0; 
while (i<N)
{
    fgets(buf, LENGTH, in);
    i++;
}
получает построчно все тексты за 35 секунд

проблема похоже не в чтении с файла , а преобразовании строки в число
0
2712 / 1879 / 556
Регистрация: 05.06.2014
Сообщений: 5,460
13.11.2014, 12:13 9
Цитата Сообщение от Leo_fmf Посмотреть сообщение
Работает 10 минут.
Это в дебаг или релиз сборке? Они по скорости могут весьма существенно отличаться.
Цитата Сообщение от Croessmah Посмотреть сообщение
Renji, затем, что операции с файлами могут хорошенько замедлить процесс считывания, если читать маленькими порциями.
Ну так файловый поток по идее должен сам буферизировать чтение.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
13.11.2014, 12:14  [ТС] 10
файл у меня весит 1,19Гб
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
13.11.2014, 12:20 11
Leo_fmf, пробовали каким-нибудь sscanf'ом разбирать?
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
13.11.2014, 12:22  [ТС] 12
пробовал релиз сделать, но толку нет

Добавлено через 42 секунды
- Leo_fmf, пробовали каким-нибудь sscanf'ом разбирать?
Это как?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
13.11.2014, 12:25 13
Leo_fmf, действительно очень странно, что С++ программа намного медленнее C#. Вопрос Renji уместен.

С каким уровнем оптимизации Вы компилируете?

Добавлено через 3 минуты
И ещё, вдогонку, уж не серчайте.
Вы, случайно, не управляемый ли C++ под .NET используете?
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
13.11.2014, 12:34  [ТС] 14
- И ещё, вдогонку, уж не серчайте.
- Вы, случайно, не управляемый ли C++ под .NET используете?

Может я не совсем понимаю о чем вы,
Я пишу в Visual Studio 2010, при создании проекта выбрал
VIsual C++\Консольное приложение Win32

Добавлено через 1 минуту
На C# я пишу SharpDevelop, я это имеет значение
0
Jesus loves me
Эксперт С++
5164 / 3137 / 353
Регистрация: 12.12.2009
Сообщений: 7,924
Записей в блоге: 2
13.11.2014, 12:34 15
Кишки в C# достаточно хорошо оптимизированы под винду + непонятно (ну т.е. я не знаю) на каком этапе там компиляция (всмысле в машинный код) происходит. Поэтому C# (как и Java) может обгонять непрофессионально написаный/собраный код на С++ на некоторых тестах.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 36
13.11.2014, 12:50  [ТС] 16
В настройка "Оптимизация все программы" используется
Использовать создание кода во время компоновки

Добавлено через 2 минуты
Все таки наверное дело все в методе

Добавлено через 6 минут
Вместо double использовал float, выполнило за 2 мин 50 сек
а в C# замена double во float сократило время обработки на 1 сек. из 47 до 46 секунд
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
13.11.2014, 13:22 17
Цитата Сообщение от Leo_fmf Посмотреть сообщение
Это как?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdio>
 
 
int main()
{
   const size_t LENGTH_MAX = 256 ;
   FILE * inputFile ;
   char buffer [ LENGTH_MAX ] ;
   inputFile = fopen ( "file.txt" , "r" ) ;
   int N = 0 ;
   fscanf ( inputFile , "%d" , &N ) ;
   double d1,d2,d3 ;
   int n1,n2,n3,n4 ;
 
   for ( int i = 0 ; i < N ; ++i )
   {
      fgets(buffer,LENGTH_MAX,inputFile) ;
      sscanf ( buffer , "%lf %lf %lf %d %d %d %d" , &d1,&d2,&d3,&n1,&n2,&n3,&n4 ) ;
   }
}
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
13.11.2014, 13:25 18
Leo_fmf, используя fscanf, я файл размером 1Gb (30*10^6 записей) прочитал за 45 секунд.
1
Jesus loves me
Эксперт С++
5164 / 3137 / 353
Регистрация: 12.12.2009
Сообщений: 7,924
Записей в блоге: 2
13.11.2014, 13:33 19
Для теста можно еще попробовать соответствующую WinAPI функцию, но думаю scanf() через эту функцию и сделан.
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
13.11.2014, 13:39 20
Цитата Сообщение от Kastaneda Посмотреть сообщение
Для теста можно еще попробовать соответствующую WinAPI функцию, но думаю scanf() через эту функцию и сделан.
Интересно. Взял файл в 53 метра. Сравниваю время работы fscanf и с fgets+sscanf
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
 
 
int main()
{
   const size_t LENGTH_MAX = 256 ;
   FILE * inputFile ;
   char buffer [ LENGTH_MAX ] ;
   inputFile = fopen ( "file.txt" , "r" ) ;
   int N = 0 ;
   fscanf ( inputFile , "%d" , &N ) ;
   double d1,d2,d3 ;
   int n1,n2,n3,n4 ;
/*
   for ( int i = 0 ; i < N ; ++i )
   {
      fgets(buffer,LENGTH_MAX,inputFile) ;
      sscanf ( buffer , "%lf %lf %lf %d %d %d %d" , &d1,&d2,&d3,&n1,&n2,&n3,&n4 ) ;
   }*/
   for ( int i = 0 ; i < N ; ++i )
   {
      fscanf ( inputFile , "%lf %lf %lf %d %d %d %d" , &d1,&d2,&d3,&n1,&n2,&n3,&n4 ) ;
   }
   fclose (inputFile) ;
}
в результате на винде получил, что вариант с fgets+sscanf отработал в 4-5 раз быстрее.
В KUbuntu 14.04 вариант fgets+sscanf отрабатывает медленнее на долю секунды
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2014, 13:39

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

C программа компилируется быстрее чем C++
Почему программа на C компилируется быстрее чем на С++?

Что может быть быстрее, чем math sqrt?
Передо мной стоит задача: Мне необходимо максимально быстро найти количество целых квадратных...

Что работает быстрее?
Подскажите пожалуйста, какая из данных реализаций будет работать бытрее? int a = 5; int b =...

Что работает быстрее?
Здравствуйте! Друзья, что лучше (правильнее) использовать: for(int i=0; i&lt;strlen(ABC); ++i) {}...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.