LINUX.ORG.RU

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

 , , , ,


9

4

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

Задачка:

Необходимо для каждой пары слов получить новое слово, так, чтобы окончание первого совпадало с началом второго, например, шлакоблок + окунь = шлакоблокунь. Это слово надо вывести в стандартный поток вывода.Если слова возможно соединить несколькими способами, надо выбрать тот, что обеспечивает максимальную общую часть, например папа + папаха = папаха (а не папапаха). Необходимо написать последнее условие.

Я просто взял практически первое попавшаяся задание.

На Перле программа заняла 5 строк не считая ввода-вывода. С вводом-выводом - 7 строк.

А как у вас? На ваших Супер-пупер языках?

Перемещено xaizek из general

Перемещено hobbit из talks



Последнее исправление: Pinkbyte (всего исправлений: 1)

Ответ на: комментарий от kompospec

Я ведь пишу программу конвертации перла на разные языки:

Ты уже разобрался как запустить компилятор плюсов?

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

///Или это школа была не совсем обычная или вы нас обманываете.

Это было ещё в Советском Союзе, а школа была с матклассом и договором с ЛИАПом (институтом авиационного приборостроения). Информатику нам преподавала препод из института в виде программирования и пропедевтики из булевой алгебры и алгебры контактных схем.

Прогали мы там в ЛИАПовских лабораториях на ЕСках 1036 с АСПО (редактор там был охренеть убогим), а потом 1045 с СВМ, т.е. ОС Система Виртуальных Машин. И на ДВК-2, их изображение можно увидеть в синеньком таком учебнике «Информатика» за авторством Ершова. И на «Правцах», когда ими оснастили школу. Но на ДВК-2 был диалект бейсика по кличке квасик (русифицированная версия с очень собственной системой программирования графики для… отдельно подключённого телевизора), а на «Правцах» сам Бейсик.

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

Да я и не сражаюсь, мне нужны метрики, пока перл жеско сливает крестам.
Кстати не против если kompospec покажет нам задачу в которой перл быстрее крестов.

demensdeum
()
Последнее исправление: demensdeum (всего исправлений: 1)
Ответ на: комментарий от demensdeum

Кстати не против если kompospec покажет нам задачу в которой перл быстрее крестов.

А он не покажет) но скажет что она есть, все попытки получить код или доказать что либо будут просто проигнорированы.

))

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

Я не разбираюсь в перле, но разве ты не говорил, что данные нужно считывать из stdin? А ты ему два файла подсовываешь.

hateWin ★☆
()

Хочу уточнить: если конец первого слова и начало второго не совпадают — программа должна просто объединить их?

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

По скорости выполнения. Только по скорости выполнения.

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

Вы уж потрудитесь продоминировать то, я тоже вижу графики из 2005-го, с того времени компиляторы C++ стали бодрее, а перл наоборот.

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

Сейчас мы уже решаем другую задачу - на скорость выполнения.

По первой задачи Перл чётко доминировал. Чётко.

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

Это рабочий код. Выполняется он примерно на 20 % дольше, чем C++, если не использовать оптимизацию. Вероятно, из-за классов-обёрток для строк и массивов(векторов).

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

не. ну это отлично.

Питон, нормальный, современный язык. Я повторю - На Плюсах пишут только старенькие, лысенькие дедушки. На стареньких заводиках бывшего СССР

kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 2)
Ответ на: комментарий от mister_VA

Меня совсем не программирование смутило. Интегралы. Но вы пояснили «школа была с матклассом».

ДВК-2, их изображение можно увидеть в синеньком таком учебнике «Информатика»

Ну выпендрились, так выпендрились. Ладно, у вас майка грязнее. У нас УКНЦ были. :)

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

А, то есть это все голословные утверждения, ничем не доказанные на практике. Мы на евангелистов насмотрелись, поэтому показывайте метрики.

demensdeum
()

Ладно, C++ regex_replace медленный, жаль что приходится все самому доказывать вместо вас.

C++

#include <iostream>
#include <fstream>
#include <regex>
#include <time.h>
using namespace std;
int main(int argc, char *argv[]) {
  ifstream file("vxod.txt");
  string line;
  clock_t start = clock();
  while (getline(file, line)) {
    auto output = regex_replace(line, regex(R"(([^+ ]*?)([^+ ]*)[ +]+\2)"), "$1$2");
    cout << output << endl;
  }
  double time = (double)(clock() - start) / CLOCKS_PER_SEC;
  cout << "Perform time: " << time << " seconds "<< endl;
};

Perl

#!/usr/bin/perl

open D, 'vxod.txt';
open V, '>vyxod.txt';

$t = time();
while (<D>) {
  s/([^+\s]*?)([^+\s]*)[\s+]+\2/$1$2/;
  print;
  print V;
  }
$t2 = time()-$t;
print "Perform time: $t2 seconds\n"

C++ Perform time: 6.04104 seconds

Perl Perform time: 0 seconds

Тестовый файл содержит повторящиеся слова, но подходящие по условиям задачи: https://dropmefiles.com/JdmVm

На месте крестовиков я бы напрягся

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

только что проверил перловскую реализацию минимум 1 секунда (это при условии что time - это epoch в секундах, а не в милисекундах или наносекундах)

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

Тут что то не то. Не могут 3 строки 6 сек обрабатываться

kompospec
() автор топика
Ответ на: комментарий от Silerus

Прошу простить за нелепую ошибку с аллокацией, все-таки я нуб

C++

#include <iostream>
#include <fstream>
#include <regex>
#include <time.h>
using namespace std;
int main(int argc, char *argv[]) {
  ifstream file("vxod.txt");
  string line;
  clock_t start = clock();
  auto pattern = regex(R"(([^+ ]*?)([^+ ]*)[ +]+\2)");
  while (getline(file, line)) {
    auto output = regex_replace(line, pattern, "$1$2");
    cout << output << endl;
  }
  double time = (double)(clock() - start) / CLOCKS_PER_SEC;
  cout << "Perform time: " << time << " seconds "<< endl;
};
Perl
#!/usr/bin/perl

open D, 'vxod.txt';
open V, '>vyxod.txt';

$t = time();
while (<D>) {
  s/([^+\s]*?)([^+\s]*)[\s+]+\2/$1$2/;
  print;
  print V;
  }
$t2 = time()-$t;
print "Perform time: $t2 seconds\n"
Запускаем так
clang++ wordcross.cpp -Ofast && ./a.out
perl -MTime::HiRes=time wordcross.perl
Результаты

C++ Perform time: 0.773497 seconds

Perl Perform time: 0.317941188812256 seconds

demensdeum
()
Последнее исправление: demensdeum (всего исправлений: 2)
Ответ на: комментарий от demensdeum

С выводом в файл

#include <iostream>
#include <fstream>
#include <regex>
#include <time.h>
using namespace std;
int main(int argc, char *argv[]) {
  ifstream file("vxod.txt");
  ofstream outputFile("vyxod.txt");
  string line;
  clock_t start = clock();
  auto pattern = regex(R"(([^+ ]*?)([^+ ]*)[ +]+\2)");
  while (getline(file, line)) {
    auto output = regex_replace(line, pattern, "$1$2");
    cout << output << "\n";
    outputFile << output << "\n";
  }
  double time = (double)(clock() - start) / CLOCKS_PER_SEC;
  cout << "Perform time: " << time << " seconds "<< endl;
};
Запускаем
Perform time: 0.75051 seconds 

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

Последние замеры для файла ~70мб
https://dropmefiles.com/0N4m3

Perl 26.216 seconds
C++ 52.604 seconds

Возможно ускорится с pgo, или читать строки через Си, но пока для крестов кейс выглядит печально.

demensdeum
()
Последнее исправление: demensdeum (всего исправлений: 3)
Ответ на: комментарий от demensdeum

Спасибо. Наконец то полезное исследование. Понимаете, мне нет никакого смысла выдумывать. Наоборот, я хочу получить для себя минимальный набор языков чтоб не забивать голову. Минимальный, но оптимальный.

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

Хотя, если я допишу свой конвертор для преобразования языков - это решит любые проблемы.

kompospec
() автор топика
Ответ на: комментарий от demensdeum

а если просто в перл и c++ открыть файл и записать в другой файл без преобразования, то быстрее io будет в перл?

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

А если сделать вызов flush после каждой записи в файл? Чтобы не влиял метод вывода в файл. Может в одном языке кэширование вывода происходит, а в другом сразу запись происходит.

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