LINUX.ORG.RU
Ответ на: комментарий от anonymous

А зачем?

как «зачем»? что-бы быдлокодить велосипеды, которые уже 100 лет как написаны в GNU/Linux. А потом сравнивать, какой велосипед лучше и быстрее - с квадратными колёсами, или с треугольными.

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

13 секунд! апписдинэть! Ну ещё-бы, если компилятор MSVC при каждой аллокации пихает в новую строчку кучу фигни, что-бы утечки памяти ловить, и в версии STL аллокации для КАЖДОЙ строки, а в версии C# аллокаций всего ОДНА. Это даже такой ламо как я (ибо не юзал уже давно MSVS) понимает...

Не распарсил этот бред. С чего ты решил что в шарпе одна аллокация?

P.S. Тест, конечно, глупый, так переворачивать строки неправильно:

var charArr = lines[i].ToCharArray();
Array.Reverse(charArr);
lines[i] = new string(charArr);

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

хотя да - тут тоже можно руками выставить нужную локаль, но это уже задача пользователя

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

Мне неясно, как наличие компиляторов в нативный код связано с проблемами совместимости.

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

При чем тут велосипеды? Обычный бенчмарк.

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

Мне неясно, как наличие компиляторов в нативный код связано с проблемами совместимости.

Так же, как несконфигурированные локали в Cygwin.

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

у меня не только этот код не работает, а вообще все примеры, что тут приводили на плюсах

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

я про код

ИМХО приведённого вполне достаточно. Если тебе что-то непонятно - по приведённому адресу доступно всё целиком и полностью.

rev: text.txt: Invalid or incomplete multibyte or wide character

яхз, УМВР:

$ echo тестовая строчка | rev
акчортс яавотсет

Ч.Т.Д.

угу. Воистенну: в твоём маздае, твоя маздайная rev не может разобраться в твоей маздайной кодировке твоего маздайного примера.

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

угу. Воистенну: в твоём маздае, твоя маздайная rev не может разобраться в твоей маздайной кодировке твоего маздайного примера.

просто кто-то не имеет понятия об локалях, а ОС - Linux, да

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

ну и что касается скорости:

~$ time rev text.txt > tmp.txt

real	0m1.110s
user	0m0.700s
sys	0m0.152s
~$ time rev text.txt > tmp.txt

real	0m1.228s
user	0m0.736s
sys	0m0.112s
~$ time rev text.txt > tmp.txt

real	0m1.114s
user	0m0.720s
sys	0m0.132s
~$ cat ./1.cpp
#include <algorithm>
#include <fstream>
using namespace std;

int main()
{
	wifstream fi( "text.txt" );
	fi.imbue( locale("en_US.UTF-8") );

	wstring s, txt;
	while( getline( fi, s ) )
	{
		reverse( s.begin(), s.end() );
		txt += s;
		txt.push_back( '\n' );
	}

	wofstream fo( "text.txt" );
	fo.imbue( locale("en_US.UTF-8") );
	fo << txt;
}

~$ g++ -Ofast ./1.cpp
~$ time ./a.out 

real	0m1.035s
user	0m0.556s
sys	0m0.200s
~$ time ./a.out 

real	0m1.066s
user	0m0.564s
sys	0m0.208s

хреново твой rev работает, раз примитивный код на С++ с ним на равне

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

хреново твой rev работает, раз примитивный код на С++ с ним на равне

А кто сказал, что внутри rev не такой же примитивный код?

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

Не распарсил этот бред. С чего ты решил что в шарпе одна аллокация?

вот:

var lines = File.ReadAllLines("text.txt");
очень возможно, что там вообще нет никакой аллокации, а юзается mmap для больших файлов. Исходников дотнета у меня нету, потому - без понятия. Для STL вот:
        string line;
        while(getline(inFile, line)) {
          lines.push_back(line);
        }

P.S. Тест, конечно, глупый, так переворачивать строки неправильно:

var charArr = lines[i].ToCharArray();
Array.Reverse(charArr);
lines[i] = new string(charArr);

а как правильно в этом вашем дотнете/шарпе?

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

А кто сказал, что внутри rev не такой же примитивный код?

дык без разницы, все-равно хреново работает

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

Да, гугл говорит, что проблема не в конфигурации а в самом cygwin.

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

просто кто-то не имеет понятия об локалях

причём тут какие-то локали?

$ echo ,多次重複和基準。| rev
。準基和複重次多,
$ echo $LANG
ru_RU.UTF-8

или этот ваш маздай даже такого не могёт?

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

причём тут какие-то локали?

при том, что для rev используется текущая локаль, указать кодировку файла другим способом - не получится

или этот ваш маздай даже такого не могёт?

ты читать умеешь? маздай у тебя только в голове, rev сфейлится на любой не utf8 локали в Solaris, FreeBSD, Linux etc.

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

хреново твой rev работает, раз примитивный код на С++ с ним на равне

вот только не надо передёргивать! Где результаты сишарпа на том же железе? Я так полагаю, что sed и то быстрее будет...

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

Где результаты сишарпа на том же железе?

$ time ./test.exe

C# time: 4296 ms

real 0m4.367s
user 0m4.156s
sys 0m0.192s

это для одной итерации без «разогрева», чтоб было честно

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

Функция File.ReadAllLines читает текстовый файл и возвращает массив строк из этого файла. Каким макаром ты узнаешь сколько тебе понадобится строк и их длину? Плюс к этому файл в utf-8, строки в .net хранятся в utf-16. Т.е. итоговый размер этого файла в памяти узнать тоже не получится.

По поводу разворота строк: если строка содержит суррогатные пары - такой переворот испортит строку.

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

А все же - пример кода на плюсах, который хотя бы _работает_ кто-нибудь выложит? Первый выложенный в треде вариант почти подходил - но при попытке добавить пару ноликов к размеру буфера тоже сломался :(

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

при том, что для rev используется текущая локаль, указать кодировку файла другим способом - не получится

одна русская буква занимает в utf-8 два байта. Один китайский иероглиф - обычно 3 байта. Это НЕ имеет отношения к локали. Ты немного путаешь локали с кодировками. Вот какая здесь локаль?

$ echo ,多次ФУХТУНГ重複和基準。| rev
。準基和複重ГНУТХУФ次多,
Как видишь, в одной строчки правильно обрабатываются все символы, и локаль на это никак НЕ влияет.

ты читать умеешь? маздай у тебя только в голове, rev сфейлится на любой не utf8 локали в Solaris, FreeBSD, Linux etc.

с чего-бы это? В однобайтной кодировке вообще всё проще - просто тупо реверс байтов. А вот что-бы многобайтные, да ещё и не utf-8 - это, батенька, как раз и есть маздай. Во всяком случае в Slackware такой локали нет.

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

Это НЕ имеет отношения к локали. Ты немного путаешь локали с кодировками. Вот какая здесь локаль?

нет, не путаю, просто только с помощью локали можно указать кодировку для rev, у тебя она содержит utf8 - значит и utf8 корректно обработается

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

Функция File.ReadAllLines читает текстовый файл и возвращает массив строк из этого файла. Каким макаром ты узнаешь сколько тебе понадобится строк и их длину?

число строк меня не волнует - никто не заставляет читать весь файл. И даже если вдруг заставят, ничто не помешает мне выделить буфер равный по размеру длине файла в байтах. Размер перевёрнутой строки равен размеру исходной. ВСЕГДА. Потому локаль вообще никак не влияет на размер. Просто, если у нас utf, то нам надо учитывать, что переворачивать надо посимвольно, и всё. Например 0xD0 0xA4 надо переносить целиком, ибо это буква «Ф», иначе получится НЁХ.

Плюс к этому файл в utf-8, строки в .net хранятся в utf-16. Т.е. итоговый размер этого файла в памяти узнать тоже не получится.

а меня не колышат проблемы КОНКРЕТНОЙ реализации. Я же говорю - маздай. В GNU/Linux STL строки могут хранится как угодно.

По поводу разворота строк: если строка содержит суррогатные пары - такой переворот испортит строку.

1. что такое «суррогатные пары»

2. почему УМВР? В т.ч. и с трёхбайтовыми иероглифами и двухбайтовой кирилицой вперемешку?

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

А все же - пример кода на плюсах

чем тебя не устраивает код без плюсов и STL? Имхо юзать для такого примитива STL как минимум глупо. Это всё равно что сравнивать самолёт и вертолёт на тестах «кто быстрее долетит до сортира?». Какая разница, если пешком быстрее в любом случае?

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

А на каком файле проверяете?

это не ко мне вопрос...

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

нет, не путаю, просто только с помощью локали можно указать кодировку для rev, у тебя она содержит utf8 - значит и utf8 корректно обработается

и что? укажу cp1251, будет и она корректно обрабатываться. А utf-8 - не будет. И что?

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

и что? укажу cp1251, будет и она корректно обрабатываться. А utf-8 - не будет. И что?

ок, а, например, utf16? в С++ можно использовать codecvt_utf16, а как это сделать в C (rev)?

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

а вообще ладно, то я уже придираюсь :) rev правильно работает со строками, если надо нестандартная кодировка - есть другие утилиты для конвертации

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

число строк меня не волнует - никто не заставляет читать весь файл.

В алгоритме приведенном автором читается весь файл.

И даже если вдруг заставят, ничто не помешает мне выделить буфер равный по размеру длине файла в байтах. Размер перевёрнутой строки равен размеру исходной. ВСЕГДА. Потому локаль вообще никак не влияет на размер. Просто, если у нас utf, то нам надо учитывать, что переворачивать надо посимвольно, и всё. Например 0xD0 0xA4 надо переносить целиком, ибо это буква «Ф», иначе получится НЁХ.

Объясняю еще раз: стандартом ecma-335 определяется что строки в clr runtime хранятся в utf-16. Строка «11111» в исходном файле занимает 5 байт, а строка в памяти занимает 10 байт, так что никакой буфер ты в памяти не выделишь, разве что только заведомо большего размера.

1. что такое «суррогатные пары»

2. почему УМВР? В т.ч. и с трёхбайтовыми иероглифами и двухбайтовой кирилицой вперемешку?

В utf-16 все символы хранятся в двухбайтных char. Если юникодный символ занимает больше 2 байт - используется суррогатная пара, т.е. один юникодный символ занимает 2 char'а. И порядок этих байт важен.

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

ок, а, например, utf16?

если честно - не знаю. utf-8 работает, ASCII работает. Мне хватает. Мне вот интересно, как в эту вашу utf-16 засовывают китайские иероглифы, в которых ТРИ байта? Или китайцы/японцы и всякие ★★★ не нужны?

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

Объясняю еще раз: стандартом ecma-335 определяется что строки в clr runtime хранятся в utf-16. Строка «11111» в исходном файле занимает 5 байт, а строка в памяти занимает 10 байт, так что никакой буфер ты в памяти не выделишь, разве что только заведомо большего размера.

проблемы негров шерифа нии...

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

Ты упоролся? Твой коммент:

...а в версии C# аллокаций всего ОДНА

Повторяю вопрос: с какого перепуга ты это решил?

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

Это делается с помощью суррогатных пар, я уже написал выше. UTF-8 - кодировка переменной длины.

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

Релиз. Какие там оптимизации я не знаю, а на попытки скомпилить из командой строки ебаный компилятор ебаной студии просто тупо не реагирует, лол.

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

поставил в виртулку - разницы нет, вот только пришлось подправить код, чтоб он собирался и корректно отрабатывал на винде, странно, что у вас он заработал

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

вот код на С++11, который не требует наличия локалей в системе:

#include <algorithm>
#include <codecvt>
#include <fstream>
#include <string>
using namespace std;

int main()
{
	locale utf8_locale( locale(), new codecvt_utf8<wchar_t> );
	wifstream fi( "text.txt" );
	fi.imbue( utf8_locale );

	wstring s, txt;
	while( getline( fi, s ) )
	{
		reverse( s.begin(), s.end() );
		txt += s;
		txt.push_back( '\n' );
	}

	wofstream fo( "text.txt" );
	fo.imbue( utf8_locale );
	fo << txt;
}
vaino
()
Ответ на: комментарий от vaino

странно, что у вас он заработал

Он и не заработал сразу, я тоже его пофиксил слегка. У тебя с какой скоростью работает (мб/сек)?

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

У тебя с какой скоростью работает (мб/сек)?

результаты такие на реальном железе, для файла в 23Мб:

g++ без STL - 61ms
Visual C++ без STL - 141ms
g++ STL - 161ms
Visual C# - 300ms
mono - 849ms
Visual C++ STL - 1813ms

поторопился я сказать, что разницы нет - думал то терминал тормозной, вобщем пока что все выглядит так, что реализация стандартной библиотеки С++ от Microsoft - отстой

vaino
()

да задолбали вы все

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

Это в убогих плюсах надо извращаться:

struct Matrix {
   float m[16];
}__attribute__((align(64));
struct Vector {
   float m[4];
}__attribute__((align(16));
//blahblahblah
Vector operator * (const Matrix& m,const Vector& v)
{
   register __v4sf vec=_mm_load_ps(v.m);
   register __v4sf result=
      _mm_add_ps(
      _mm_add_ps(
          _mm_mul_ps((__v4sf)_mm_shuffle((__m128i)vec,0x00),
                     _mm_load_ps(v.m)),
          _mm_mul_ps((__v4sf)_mm_shuffle((__m128i)vec,0x55),
                     _mm_load_ps(v.m+4))),
      _mm_add_ps(
          _mm_mul_ps((__v4sf)_mm_shuffle((__m128i)vec,0xAA),
                     _mm_load_ps(v.m+8)),
          _mm_mul_ps((__v4sf)_mm_shuffle((__m128i)vec,0xFF),
                     _mm_load_ps(v.m+12)))
   );
   Vector out;
   _mm_store_ps(out.m, result);
   return out;
}
Vector operator * (const Vector& v, const Matrix& m)
{
   register __v4sf m0,m1,m2,m3,t0,t1,t2;
   register __v4sf vec=_mm_load_ps(v.m);
   
   t0 =_mm_mul_ps(vec, _mm_load_ps(v.m+0));
   t1 =_mm_mul_ps(vec, _mm_load_ps(v.m+4));
   m0=(__v4sf)_mm_unpacklo_epi32((__m128i)t0,(__m128i)t1);
   m1=(__v4sf)_mm_unpackhi_epi32((__m128i)t0,(__m128i)t1);
   t0 =_mm_mul_ps(vec, _mm_load_ps(v.m+8));
   t1 =_mm_mul_ps(vec, _mm_load_ps(v.m+12));
   m2=(__v4sf)_mm_unpacklo_epi32((__m128i)t0,(__m128i)t1);
   m3=(__v4sf)_mm_unpackhi_epi32((__m128i)t0,(__m128i)t1);

   vec=_mm_add_ps(
       _mm_add_ps(
       (__v4sf)_mm_unpacklo_epi64((__m128i)m0,(__m128i)m2),
       (__v4sf)_mm_unpackhi_epi64((__m128i)m0,(__m128i)m2)),
       _mm_add_ps(
       (__v4sf)_mm_unpacklo_epi64((__m128i)m1,(__m128i)m3),
       (__v4sf)_mm_unpackhi_epi64((__m128i)m1,(__m128i)m3))
   );
   Vector out;    
   _mm_store_ps(out.m, vec);
   return out;
}
И все равно оно тормозит. А собирающие мусор на помойках языки имеют такие мегакомпиляторы, что надо просто подождать и оно само все заоптимизирует так, что быстрее процессора летать будет. ОЛОЛО.

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