24

Beating C with 1 line of Brainfuck

 4 years ago
source link: https://kiwec.net/blog/posts/beating-c-with-brainfuck/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Following on the recent “faster than wc” blogposts, I decided to end this fad once and for all, using the best language ever created : Brainfuck .

>>,+><[-----------[----------------------[>+<<-[<+>+]>[-]][-]]<[-]>>[<<+>>-]<,+]<[-]<[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<[.[-]<]>++++++++++.

Well, obviously, that’s not very readable. We just needed to put that in for the sweet clickbait ;)

Here is the actual code :

  VARIABLES (in cell order) :
      total = 0
    > was_letter = 0
    > input ,+
    > tmp0

while the input isn't EOF : we count words <[-
  ---------- if input is not a newline [
    ---------------------- if input is not a space [
      >+         tmp0 = 1
      <<-[<+>+]> if not was_letter increment total
    [-]]
  [-]]

  <[-]       clear was_letter
  >>[<<+>>-] move tmp0 to was_letter

  <, take input again
+]

<[-]<

print the total (nothing new)
[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>]<<<<<]>[-]++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<[.[-]<]
>++++++++++.

To get the maximum performance out of it, I choose to use funkicrab , which totally doesn’t compile to C (I used clang with -O3 , if you are wondering). Since cells need to be 32-bit for counting more than 255 words, you’ll also need to replace the few occurrences of char to int .

So, how fast can it run ?

$ cat words.txt | time wc -w
13018291
0.52 user
0.01 system
0:00.55 elapsed

$ cat words.txt | time ./bfwc
13018291
0.50 user
0.02 system
0:00.54 elapsed

Looks like we won a hundredth of a second counting the number of words in a 85 Megabyte file. Which I do all day, every day, so I’m now relaxing by thinking about all the free time I gained.

Wait, of course not, this was a complete waste of time. Hope you enjoyed it nonetheless :)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK