LINUX.ORG.RU

скорее C++ годится для реверса строк в текстовом файле :)

lazyklimm ★★★★★
()

Ученые выяснили что C++ не годится для операций ввода-вывода

«Школьники продемонстрировали неумение писать на С++» //fixed

Ничего, что push_back для вектора в худшем случае приводит к выделению нового массива в куче с размером +1 и копированию туда старых данных?

AIv ★★★★★
()

Похоже, это были «британские учОные» ☺

А вот если заменить s/C#/C/g, то получим выражение КО.

Eddy_Em ☆☆☆☆☆
()

Ничего, что они в приплюснутом варианте читают файл по строкам, а в шарповом режут на строки прочитанный целиком файл? Что быстрее, одна операция ввода-вывода или 100?

Да, уберите слово «ученые» из заголовка темы. Дезинформирует.

delete83 ★★
()
Ответ на: комментарий от delete83

в шарповом режут на строки прочитанный целиком файл

Интересно, что они будут делать, если файлик будет иметь размер в пару ГБ?

Хотя бы mmap сделали, что ли…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Похоже, это были «британские учОные»

Видимо с эстонскими корнями - у них даже программы на С++ работают оочченьь медленнооо;-)

Вообще хороший пример того, как лехко на С++ писать неэффективные программы.

AIv ★★★★★
()
Ответ на: комментарий от Eddy_Em

Если уж решили меряться чле^Wскоростью ввода/вывода, то нужно в обеих задачах сделать равные условия для самой медленной операции во всем алгоритме. Читать текст без разбора блоками, а разбор на строки вести уже в памяти.

delete83 ★★
()
Ответ на: комментарий от delete83

Что быстрее, одна операция ввода-вывода или 100?

С учетом буферизации это одно и то же (с точностью до вызова вирт. ф-й ес-но).

AIv ★★★★★
()
Ответ на: комментарий от AIv

Простите мне мою неграмотность, но разве когда я читаю из файла одну строку длинной в 10 символов (не считая символов \n и \r), то буферизуется сразу блок в пару мегабайт (я не в курсе, как там буферизация работает)?

delete83 ★★
()
Ответ на: комментарий от delete83

Типа того. Вообще без буферизации ничего не работало бы.

Да старый пример, код вида

for(int i=0; i<N; i++ ) cout<<arr[i]<<endl;
оказывается в дцать раз медленней чем
for(int i=0; i<N; i++ ) cout<<arr[i]<<"\n";
потому что endl дергает flush. Это на запись, а на чтение ОС сама довольно эффективно буферизует все, что надо. Конечно, читать большими блоками лучше, но не то что бы совсем кардинально, ИМНО там скорей затык в дергании вирт. оператора >> и буферизации в iostream, которая вообще то никогда скоростью не славилась.

mmap конечно лучше всего, как в шарпах сделано вообще ХЗ.

AIv ★★★★★
()
Ответ на: комментарий от ratatosk

+1 - это вряд ли. Он наращивает экспоненциально.

Хорошо если так, но все равно log(N) лишних .new + операций копирования всего содержимого там встречаются. new операция дорогая, а копирование всего что в векторе еще дороже...

AIv ★★★★★
()

«грязный» код, но гарантированно более быстрый, чем то убожество по ссылке:

#include <cstdio>
#include <cstring>

int main()
{
	char text_buf[ 1000000 ];
	char line_buf[ 1000000 ];
	char ch;
	char *el = line_buf + sizeof line_buf;
	char *line = el;

	FILE *f = fopen( "text.txt", "rt+" );
	int count = fread( text_buf, 1, sizeof text_buf, f );
	for( int i = 0 ; i < count ; ++i )
	{
		ch = text_buf[ i ];
		if( ch == '\n' )
		{
			int len = el - line;
			memcpy( text_buf + i - len, line, len );
			line = el;
		}
		else
		{
			*--line = ch;
		}
	}

	fseek( f, 0, SEEK_SET );
	fwrite( text_buf, 1, count, f );
	fclose( f );
}
vaino
()

имхо этот пример показывает негодность виндавс программистов.. даже пример не запустить :/

qnikst ★★★★★
()
Ответ на: комментарий от vaino

прогнал на файле

utf8 это наше всё
абырвалг

исходный вариант не проверял, ибо шарпа нет, а плюсовый не собирается

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

utf8

плюсовой вариант и в оригинале с utf8 не будет работать, хотя в принципе в моем варианте совсем немного нужно дописать, чтоб его поддерживать

vaino
()
Ответ на: комментарий от vaino

не собирается плюсовый в топике. твой код работает с байтами, а не с символами, если текст в кодировке, где символ больше одного байта, то текст ломается.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

не собирается плюсовый в топике. твой код работает с байтами, а не с символами, если текст в кодировке, где символ больше одного байта, то текст ломается.

код по ссылке работает аналогично моему, std::string - не работает с utf8

vaino
()
Ответ на: комментарий от AIv

[..]а копирование всего что в векторе еще дороже...

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

dave ★★★★★
()

ученые были британскими?

Reset ★★★★★
()
Ответ на: комментарий от delete83

Что-то там бормочет про стандартные средства обоих языков...

delete83 ★★
()

Ученые выяснили, что STL не годится для операций ввода-вывода

Так правильно.

unsigned ★★★★
()
Ответ на: комментарий от vaino

а нет - извиняюсь, забыл добавить цикл до 20 для С++, теперь так:

C# time: 14203 ms
C++ time: 27ms

при том, что код на C# более чем успевает раскочегаривать процессор на все 4.8Гц, а код на С++ отрабатывает на 1.6Гц, если верить асусовской приблуде

vaino
()
Ответ на: комментарий от vaino

Тебя ничего не смущает в твоём сравнении байт-кода с нативным? А в учёте миллисекунд? А в выдавании C за C++?

unsigned ★★★★
()
Ответ на: комментарий от unsigned

Тебя ничего не смущает в твоём сравнении байт-кода с нативным?

нет, не я предложил его сравнивать

А в учёте миллисекунд?

в случае с C# - вполне себе секунд

А в выдавании C за C++?

это валидный код для С++, я пониманию - у многих рвет шаблоны, но это так

vaino
()
Ответ на: комментарий от schizoid

в примере вот такое начало:

#include <vector>
#include <fstream>
#include <string>
#include <algorithm>
#include <iostream>
#include <windows.h>
#include <sstream>
using namespace std;

AIv ★★★★★
()
Ответ на: комментарий от AIv

Это такая куча инклюдов всего лишь для того, чтобы каждую строку записать задом-наперед?

А на кой черт, интересно, там нужны vector, string, algorithm (WTF?)? И разве sstream и fstream не должны быть в iostream?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от vaino

не я предложил его сравнивать

Но ты начал делать это неправильно.

вполне себе секунд

27ms - это в пределах погрешности, поэтому твой тест вообще ни о чём.

это валидный код для С++

Однако это нерелевантный тест для C++. Он для C.

unsigned ★★★★
()
Ответ на: комментарий от lazyklimm

у тебя там не C++, а C

да сколько ж вас таких :) этот код - на С++, который тем и удобен, что позволяет писать в узких местах более низкоуровнево

vaino
()
Ответ на: комментарий от unsigned

Но ты начал делать это неправильно.

более правильно чем в оригинальном коде для С++

27ms - это в пределах погрешности, поэтому твой тест вообще ни о чём.

14203 ms для C# - это тоже в пределах погрешности? глупость ты ляпнул

Однако это нерелевантный тест для C++. Он для C.

я поражаюсь, сколько людей не пишущих на С++, начинают учить человека, который пишет на С++, как правильно на нем писать

vaino
()
Ответ на: комментарий от Eddy_Em

Ага, берем чистый С, заворачиваем его в extern «C» и получаем плюсы ☺

садись - двойка, т.к. плюсы ты не знаешь

vaino
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.