LINUX.ORG.RU

Требуется пруф

 ,


0

2

Легкая задачка по С (комментарий)

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

Ну, я протестил эти автоматы, оказалось, что 10000 итераций на 10 - символьной строке, дают где то от 3 до 10 ms, в зависимости от среды выполнения и строки.

Это все на слабой машине, 2 ядра, че то там, примерно 2 гига оперативки, проц amd64, текущая тактовая частота 800000 или около того. Операционка debian 64

Мне сказали, что это медленно, LOL. При этом, скорость сишных вариантов никто не выложил

На сколько сишный алгоритм будет быстрей? Приложите бенчи.



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

то есть тебя не смущает, что твой JS пользует регулярки из сишной либы?

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

Там разговор был за то, что сишный чувак всегда смогЁт запилить более лучше. Ну, это всегда так. Мол, регулярки не используй, они тормозят.

Кроме того, ЕМНИП, JS использует свой движок регулярок, я уж не знаю, на чем он написан.

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

И да, читай внимательно:

Мне сказали, что это медленно

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

я уж не знаю, на чем он написан.

Да, выбор вариантов для написания движка regexp-ов просто-таки невообразимо широк!

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

Писал на паскале в универе :D работало. только группы неосилил. На JS тож не вижу причин не написать. Но пока такого изврата не видел.

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

более лучше

Тебе еще рано регулярные выражения обсуждать, учи пока степени сравнения прилагательных.

invy ★★★★★
()

Тем временем инет завален статьями вида: «Как ускорить regex в 10 раз». Что уже говорит о многом.

На самом деле регулярка всегда будет медленнее ручного алгоритма (при условии что регулярка написана на том же языке), но намного проще в написании и понимании. Для чего и была придумана.

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

anonymous
()

что 10000 итераций на 10 - символьной строке, дают где то от 3 до 10 ms

Взял те же 10 символов и 10000 итераций и получил со своим вариантом в среднем около 1.5 ms.

Но речь не о том. ;) Можно сделать так, можно сделать эдак. Иногда важно одно, иногда другое.

Но в общем случае, пихать везде regexp — это из пушки по воробьям. Часто они совсем не нужны.

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

но намного проще в написании и понимании

А я что-то до сих пор их закурить окончательно не могу. Лень разбираться как-то... Сегодня заполню пожалуй этот пробел.

FIL ★★★★
()

newquestion

Есть пароль, от 6 до 18 символов
Нужно, что бы он содержал хотя бы 1 заглавную, 1 строчную и 1 цифру

Насколько я понял заглавная/строчная это кирилица.

Дано - файлец с паролями(формат пароль_разделитель_пароль..., т.е. passwd\npasswd\n). Надо - прочитать пароли и высрать «%passwd% - 1/0\n», где один - валидный пароль, а 0 соответственно невалидный.

Либо записать их в 2файла - одни с валидными, а другой с невалидными - как хочешь.

Вперёд. Покажи мощь жабаскрипта.

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

Но в общем случае, пихать везде regexp — это из пушки по воробьям.

в общем случае из пушки по воробьям таки эфективно

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

ниилитненько как-то. Для средненьких умов. настощие трупрограммисты, коим является анонiмус не морочатся такими задачками. Вот вселенную реализовать...или модель круга ... или просто круг. Это илитненько.

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

потестил твою реализацию testpw()

	int i;
	double sum;
	struct timespec start, stop;
	
	for(i = 0, sum = 0; i < 1000; ++i) {

		clock_gettime(0, &start);

		for(int j = 0; j < 10000; ++j) {
			testpw("Password11");
		}

		clock_gettime(0, &stop);

		sum += stop.tv_sec - start.tv_sec +
				(double)(stop.tv_nsec - start.tv_nsec) / 1000000;
	}
	
	printf("%.3lfms\n", sum / i);

0.666ms

Linux power 4.0.5-gentoo #1 SMP Mon Jul 6 20:58:05 EEST 2015 x86_64 Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz GenuineIntel GNU/Linux

/thread

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

На самом деле регулярка всегда будет медленнее ручного алгоритма (при условии что регулярка написана на том же языке)


var test = function(str){
  return /[A-ZА-ЯЁ]/.test(str) && /[a-zа-яё]/.test(str) && /\d/.test(str)
}
i = 10000
console.time("tst")
  while(i--) test("fooooooooo")
console.timeEnd("tst")







lower = "abcdefghigklmnoprqstuvwxyzабвгдеёжзийклмнопрстуфхцчшщэюя"
upper = lower.toUpperCase()
numbers = "0123456789"


isExists = function(stringArray, pattern){
   for(var i = 0; i <= stringArray.length; i++){
      if(pattern.indexOf(stringArray[i]) > -1) return true
   }
   return false
}


var testRe = function(string){
  return /[A-ZА-ЯЁ]/.test(string) && /[a-zа-яё]/.test(string) && /\d/.test(string)
}

var testNoRe = function(string){
   string = string.split("")
   return isExists(string, lower) && isExists(string, upper) && isExists(string, numbers)
}

test = function(i, f, string, funcName){
  console.time(funcName)
     while(i--) f(string)
  console.timeEnd(funcName)
}


bench = function(string){
   test(i, testNoRe, string, "testNoRe")
   test(i, testRe, string, "testRe")
}

i = 10000

;["jjjjjjjjjjj",
 "oooooooooooo",
 "JJJJJJJJJJJJJJJ",
 "OOOOOOOOOOOOO",
 "ooooooooooooooJ",
 "JJJJJJJJJJJJo",
 "111111111111110",
 "0000000000000001",
 "ooooooooooooo1",
  "1111111111111j",
 "ooooooooooooooJ1",
 "jjjjjjjjjjjjjjjO1"
] . forEach(function(string){bench(string)})


/*
v8:

testNoRe: 43ms
testRe: 4ms
testNoRe: 40ms
testRe: 4ms
testNoRe: 43ms
testRe: 4ms
testNoRe: 39ms
testRe: 3ms
testNoRe: 44ms
testRe: 6ms
testNoRe: 65ms
testRe: 5ms
testNoRe: 43ms
testRe: 1ms
testNoRe: 46ms
testRe: 2ms
testNoRe: 43ms
testRe: 2ms
testNoRe: 41ms
testRe: 2ms
testNoRe: 47ms
testRe: 6ms
testNoRe: 48ms
testRe: 6ms

ff:

tst: таймер запущен localhost:8888:14
tst: 5.51мс localhost:8888:16
testNoRe: таймер запущен localhost:8888:47
testNoRe: 35.97мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 3.74мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 34.86мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 0.99мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 36.75мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 5.64мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 32.57мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 1.96мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 34.93мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 7.22мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 42.72мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 2.74мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 33.34мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 0.97мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 34.73мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 0.99мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 31.57мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 0.9мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 30.93мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 0.91мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 34.22мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 3.01мс localhost:8888:49
testNoRe: таймер запущен localhost:8888:47
testNoRe: 35.94мс localhost:8888:49
testRe: таймер запущен localhost:8888:47
testRe: 3.05мс localhost:8888:49
*/
newquestion
() автор топика
Ответ на: комментарий от anonymous

Че то я не понял, ты предлагаешь реализовать то что я реализовал в одну строку, только добавить чтение/запись в файлы, и в этом будет мощь?

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

В чем «алгоритм»? В io с добавлениием 1/0? ну так круг нарисовать действительно сложней, там надо аж строк 5 писать.

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

то что я реализовал в одну строку

А твоя строка реализована в тысячах строк высокопроизводительного C++ кода, кишащего ассемблер-вставками. Это как бы не в упрек, но источник «мощи» не имеет отношения к js. Для каждой задачи - свой инструмент. Чтобы меряться пипками - js не лучший вариант.

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

А че ты мне тут капитанствуешь, вопрос в этом разве? Ты еще расскажи на чем написан си, уж не на нем ли самом часом?

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

Для каждой задачи - свой инструмент

Вот именно, что си вообще надо бы выбросить на помойку давно, вместе с плюсами. Выигрыш в производительности в среднем, от 2 до 10 раз, а по расходу человекочасов — в тысячи. И это еще без учета того, что основной выигрыш будет в правильно выстроеной архитектуре, а не в этих спичках

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

А с массовым внедрением asmjs и других расширений, перспектива всех этих си-подобных и вовсе выглядит удручающей.

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

И чё? (с)

Очередное доказательство того, что JS тормозной уг.

regex в v8, если верить гуглу, написан на scheme. Которой явно быстрее вашей унылой реализации поиска, которая даже не regex, а просто перебор.

То есть, да, для унылого JS и других скриптовых языков, выгоднее вызывать regex написанные на нормальных языках, а не писать самому.

Если уж вам так захотелось примитивных тестов, но с использованием нормальных инструментов, то:

#include <benchmark/benchmark_api.h>
#include <benchmark/macros.h>

#include <QRegularExpression>

#include <string>

int testpw(char *pw)
{
        int hasUpper = 0;
        int hasLower = 0;
        int hasDigit = 0;
        char *s;

        for (s = pw; *s; s++) {
                if (!isascii(*s))
                        return 0;
                if (isupper(*s))
                        hasUpper = 1;
                if (islower(*s))
                        hasLower = 1;
                if (isdigit(*s))
                        hasDigit = 1;
        }

        return hasUpper && hasLower && hasDigit && s-pw >= 6;
}

static void BM_CStyle(benchmark::State& state) {
    char str[] = "pwEr12zQ";

    int res;
    while (state.KeepRunning()) {
        for (int i = 0; i < 10000; ++i) {
            res = testpw(str);
        }
    }
}
BENCHMARK(BM_CStyle);

static void BM_QRegExp(benchmark::State& state) {
    QString str = "pwEr12zQ";
    bool res;
    while (state.KeepRunning()) {
        for (int i = 0; i < 10000; ++i) {
            res = str.contains(QRegExp("[A-ZА-ЯЁ]"))
                    && str.contains(QRegExp("[a-zа-яё]"))
                    && str.contains(QRegExp("\\d"));
        }
    }
}
BENCHMARK(BM_QRegExp);

static void BM_QRegExpQt5(benchmark::State& state) {
    QString str = "pwEr12zQ";
    bool res;
    while (state.KeepRunning()) {
        for (int i = 0; i < 10000; ++i) {
            res = str.contains(QRegularExpression("[A-ZА-ЯЁ]"))
                    && str.contains(QRegularExpression("[a-zа-яё]"))
                    && str.contains(QRegularExpression("\\d"));
        }
    }
}
BENCHMARK(BM_QRegExpQt5);

BENCHMARK_MAIN();
Run on (4 X 4199.93 MHz CPU s)
2015-10-28 16:05:40
Benchmark       Time(ns)    CPU(ns) Iterations
----------------------------------------------
BM_CStyle         387079     350000       2000                                 
BM_QRegExp      12014100   14680851         47                                 
BM_QRegExpQt5   22400188   27600000         25    
anonymous
()
Ответ на: комментарий от newquestion

Ну могу понять, ты так троллишь неумело или в самом деле такой тупой?

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

Вот именно, что си вообще надо бы выбросить на помойку давно, вместе с плюсами.

вместе с плюсами

Ну-ну.

А на чём твой любимый Js написан? На себе самом что ли?

Пукнул ты в этот тред сейчас тоже с браузера на крестах.

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

Вот именно, что си вообще надо бы выбросить на помойку давно

А для всяких армов мипсов на чем тебе говноJS машину нпишут, чтоб ты смог круг нарисовать?

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

Posted: Wednesday, February 4, 2009

Какой-то некролит же.

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

Ах почему же, почему же так происходит. Наверное потому, что регулярки-то на сишке, а твоя реализация на жабаскрипте.

Вся суть недоязычка и его адептов. Нулина путает биндинг левой реализации к недоязычку и недоязычок.

Это так мило

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

от 2 до 10 раз

Копейки. У тебя фотография из raw преобразуется в jpeg не 10 секунд, а 100. И у тебя 2-3 сотни фотографий, которые ты перегоняешь. Итог: вместо 50 минут ты ждешь 8 часов.

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

Это типичные кусающие кормящую их руку невежды.

Пока серьёзные дяди-крестуны/дяди-сишники пишут для всяких Наташ с Ростова реализацию на ASM/С/С++ простого языка Javascript, в котором можно говнокодить и не думать о памяти и прочем, эти самые Наташи с Ростова «фыркают» при виде сишников или кода на С. А особо «прошаренные» Наташи говорят, что ненужны все языки, кроме их любимого JavaScript'а. А C/C++ надо вообще закопать.

Ситуация напоминает такую же, которая была во времена рассвета говнокодеров-макак на PHP. Тогда каждая PHP-макака считала, что операционные системы и браузеры следует переписать на PHP, а C ещё годик поживёт и умрёт, так как его вытеснит PHP.

Подкреплю пруфцом: компилируемые языки программирования вымрут или нет?

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

А на чём же? Что ещё за «примитивы си» такие? Совсем уже крякнулся?

anonymous
()

заставить краснеть сишников

Что за избирательность? За тебя не только сишники краснеют.

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

зобанили чтоль опять? Модераторы, выдайте ему уже пожизненный логин с невозбранным безбаном, а то только привык к новому анонiмусу, а его уже зобанили. :(

anonymous
()

Опять вахтер прошелся, ну что за свинство.

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

Ты еще расскажи на чем написан си, уж не на нем ли самом часом?

Это чудесно.

i-rinat ★★★★★
()
Ответ на: комментарий от newquestion

В может, ему на этот раз таблетки паленые попались? Напишите уже кто-нибудь в органы опеки, что малолетний шизофреник без присмотра шлендрается.

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

регулярка всегда будет … намного проще в … понимании

Зелёный ещё совсем. Когда копнёшь что-то проще A-z, увидишь, какая это write only сущность.

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