Автор Тема: [Задачка-закачка] abs() - намиране на алтернатива  (Прочетена 5390 пъти)

hojotoho

  • Новаци
  • *
  • Публикации: 2
  • Distribution: Gentoo
  • Window Manager: fvwm
    • Профил
Решение на Perl:

Код
GeSHi (Perl):
  1. #!/usr/bin/perl
  2.  
  3. $n = $ARGV[0];
  4. printf "%d\n", abs($n);
  5. exit 0;
  6.  
  7. sub abs {
  8. ($k) = @_;
  9. $k =~ s/\D//gi;
  10. return int($k);
  11. }
::)
Активен

edmon

  • Гост
хайде сега да сметнете кое е по-бързо abs() или функцииката, която сте забъркали, като същевременно
си пеете песента на Дони и Момчил - "На кой му трябва това"
Активен

Drago_

  • Напреднали
  • *****
  • Публикации: 34
    • Профил
Код
GeSHi (Bash):
  1. #!/bin/sh
  2.  
  3. echo $1 | tr -d '-'
  4.  
  5.  

 ;D
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
хайде сега да сметнете кое е по-бързо abs() или функцииката, която сте забъркали, като същевременно
си пеете песента на Дони и Момчил - "На кой му трябва това"

"На кой му трябва това" ... излизане от шаблона, разчупване на мисленето и т.н. Ясно е, че резултатът от задачката сам по себе си е лишен от смисъл, но приомите, с които е постигнат не са.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Код
GeSHi (Bash):
  1. #!/bin/sh
  2.  
  3. echo $1 | tr -d '-'
  4.  
  5.  

 ;D

PHP вариант:
Код
GeSHi (PHP):
  1. function _abs($a) { return intval(ltrim($a, '-')); }
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

CTEHATA

  • Напреднали
  • *****
  • Публикации: 101
    • Профил
Код
GeSHi (Javascript):
  1.    function abs_a(anInt)
  2.  {
  3. return Math.max(anInt,-anInt);
  4.  }
  5.    alert(abs_a(-2));
  6.  
Това май ще е най-близо до бързодействието на оригиналната функция  ;D
Активен

CTEHATA

  • Напреднали
  • *****
  • Публикации: 101
    • Профил
ХАХАХАХАХАХАХ!
Не мога да повярвам!
Ето това е още по-бързо:
Код
GeSHi (Javascript):
  1.   function abs_a(anInt)
  2.      {
  3.         // return anInt*-(anInt<0) + anInt*(anInt>0)
  4.             return anInt*(anInt>0-anInt<0)
  5.      }
  6.  
Но и двата ми примера са по-бързи от вградената Math.abs()  поне за тестваните Firefox за x86_64 Linux, Firefox за Win XP32 и IE за XP 32!!!
тествайте и други браузери моля
http://jsperf.com/max-avsmax-b

П.П. Това май дава интересен пример за смисъла на упражненията за мозъка - могат да ни покажат неща, които не са ни и хрумвали, когато сме започвали да го размърдваме.
« Последна редакция: Jul 18, 2011, 19:28 от CTEHATA »
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
OpenCL :)

Цитат
uint abs(int x)
{
  return bitselect((x>(-x)),-x,x);
}

Поне при AMD видеокарти обаче, това е безкрайно безсмислено. Там самата архитектура е направена с идеята за abs(). Всяка integer инструкция има modifiers на входните операнди, един от тях е да вземе абсолютната стойност. Това става без performance penalty. Гореописаният код е дооооста по-бавен, отколкото да ползваш abs().


Цитат
хайде сега да сметнете кое е по-бързо abs() или функцииката, която сте забъркали, като същевременно
си пеете песента на Дони и Момчил - "На кой му трябва това"

По принцип е така. Като изключим елемента на човъркането (който е тоооолкова присъщ на линукс-хората), все пак мисля, че има ограничена практическа полза, когато гониш performance. Примерно аз съм виждал memcmp() имплементация, която работи по-бързо стига данните да са aligned и същата ми е свършила добра работа с password cracking глупостите. memcmp() по принцип не може да прави такива предположения и трябва да проверява. Ако двата региона памет, които сравняваш ти почват от адрес в паметта, кратен на 8 (на 64-битова архитектура) и имат дължина кратна на 8 (или си убеден че са pad-нати с нулеви байтове), можеш да кастваш към unsigned long long и да сравняваш и това е по-бързо по разбираеми причини. Не винаги компилатора и стандартните библиотеки ти осигуряват максимална производителност. И не винаги се налага да прибягваш до дивотии от сорта на inline assembly, за да изстискаш каквото може :)
« Последна редакция: Jul 18, 2011, 22:27 от gat3way »
Активен

"Knowledge is power" - France is Bacon