#🪅-progaming

1 messages · Page 108 of 1

royal nymph
#

is that why it takes so long to compile

valid jetty
#

no

#

it takes so long to compile because rust has 1 billion zero cost abstractions, which means traits and templating of generics

#

generic deduction is a very slow algorithm (i believe exponential) and rust does so much fucking templating on top of templating that compile times are driven through the roof

#

which is also why big rust libraries take so long to compile, because they also do a shit ton of templating

#

thats also the main reason zig takes 15 seconds to produce a hello world on my machine

#

generics are extremely slow to compute

#

elle doesnt take very long because i dont compute many generics, if i did, it would also be extremely slow

fleet cedar
#

A lot of compiler stuff has dragon theme for some reason

#

The Dragon Book, the ryu algorithm, and ghidra are others

hearty lintel
ivory heath
#

rust is faster than C in most cases
typically the opposite is true but both when optimized to their limits perform nearly identically or comes down to compiler quirks

valid jetty
valid jetty
ivory heath
valid jetty
#

im talking more about using vecs and optionals and stuff

#

writing your own dynamic array in C will likely be slower than the rust out-of-the-box std::Vec

ivory heath
#

sodathink yeah probably

#

i think most people should use c++ if they need something like that

#

templating for example in C is a nightmare

royal nymph
royal nymph
#

you watched too much tsoding

valid jetty
#

open C library
dynamic array

fleet cedar
#

Nobody writes C these days, but those that do probably have a vec implementation

ivory heath
valid jetty
ivory heath
#

you can disable the GC auto run and exclusively call it yourself when conditions are met which they seem to have wanted to do

valid jetty
#

isnt that just an arena allocator now

#

except it doesnt free everything so i guess not

ivory heath
valid jetty
#

a common pattern in non-managed languages is

  • allocate everything into a big region
  • free it all at once at the end
#

instead of manual allocation and freeing in every place

ivory heath
#

what are you calling a memory arena

#

is what im confused about

valid jetty
#

the manual gc, which im going insane because thats not

ivory heath
#

oh yeah.

#

memory arenas were a proposal for golang

#

but there is no standard way to pass them

#

and the stdlib for it to actualy be useful would have to be updated to support it

#

so its on the back burner rn

valid jetty
#

i like the way i did it but i dont think golang can do this because threading and stuff

ivory heath
valid jetty
#
  • allocator is an abstract structure that holds function pointers to the current allocator stuff like alloc, free, realloc, etc
  • this is set in a thread global static structure
  • functions call the function pointer from there to allocate memory and get back a pointer

now a gc would automatically free, if you swap the allocator to arena you manually free after you call various memory-allocating functions

#

though idk how the "thread global static structure" plays in go

hearty lintel
valid jetty
#

almost every useful C library that ive looked at the source code for has its own dynamic array implementation somewhere within it

ivory heath
#

I wish the stdlib was as good for c as it is for c++ but no generics makes that really hard.

valid jetty
#

oh yeah

#

that reminds me

#

a while ago i figured out how to make generics in C

ivory heath
#

its easy to do with macros

valid jetty
#

you can even use typedefs to make generics for non-identifier types like pointers

hearty lintel
valid jetty
#

no lol the custom vec implementations are usually slower, but what i meant is in C everyone reinvents the wheel for dynamic arrays because its C (and because its not a lot of code)

#

rust has specialized implementations for particular types

#

a naive implementation of a vec will be slower than the rust one for primitive types

ionic lake
#

how about you C deez nuts

ivory heath
# valid jetty

this is the canonical way to do it but not all compilers support it and improper usage can be a nightmare to debug

valid jetty
#

you can even make generic functions like this

ivory heath
#

if i ever need generics im just gonna use C++

valid jetty
#

yeah

ivory heath
#

c++ and rust std:vec are near fast as possible and use multiple optimizations under the hood

#

sort for example for both if the compile time size is known will use not a generic sorting algorithm like quicksort but the mathmaically fastest for X elements for small size arrays

frosty skiff
#

the other logo is cooler ngl

deep mulch
#

@valid jetty rewriting elle to use llvm when

lavish frigate
#

Since C is the best, and C++ is incrementing on C… doesn’t that mean that it overflows making C++ the worst? Follow for more programmer humor

valid jetty
#

Since C is the best, and C++ is incrementing on C… doesn’t that mean that it overflows making C++ the worst? Follow for more programmer humor

valid jetty
royal nymph
limpid mica
lavish frigate
deep mulch
#

@limpid mica the 87th flower

limpid mica
spark tiger
#

just found out that it was fucking raycast that caused issues with clipboard in my entire os

#

now im kinda curious to find out why exactly it does this

#

first idea is that it doesnt close clipboard properly?

#

it has clipboard history

#

a huge part of their clipboard manager is made in rust

#

so it looks quite different in pseudocode in ida

#

i guess i can try to hook winapi's CloseClipboard func with detour and make it log it into the console to see if it actually closes it properly?

#

i mean it’s kinda good

#

i can have spotlight on windows

tired vigil
#

raycast my beloved

crimson sparrow
spark tiger
#

it’s a private beta for windows so i can kinda forgive them for this

spark tiger
#

raycast hate is forced

crimson sparrow
spark tiger
#

last time i used it it was very slow on my laptop though

crimson sparrow
spark tiger
#

soon i’ll have actual spotlight so i don’t really need neither of these

lucid trail
#

i dont even want it to be good but it is

spark tiger
spark tiger
supple whale
#

its way better

#

currency converter is fucking goated, i use it so much

alpine pecan
#

lc.wa 10 usd to btc

visual shellBOT
tired vigil
supple whale
tired vigil
#

😭

spark tiger
#

okay uh i found this though im not really sure what this gets me

spark tiger
#

saves so much time

tired vigil
#

the ux is so much nicer than powertoys run or flow launcher tbh

spark tiger
tired vigil
#

same blobcatcozy

#

but recently its just gotten worse

#

the everything integration stopped working for me completely

#

although raycast file indexing is absolute dogshit too

#

so idk

spark tiger
#

they gotta embed Everything

#

also iunno its kinda aight for me

#

i mean raycast's

supple whale
#

3rd party

tired vigil
supple whale
spark tiger
#

can it convert time

#

like

#

6am utc to your local

#

one thing about raycast though is

#

but they seem to be improving this

#

last time i checked it was 600ish mb

#

now its only 400mb

supple whale
supple whale
#

i'd have to look up the cmd for it

tired vigil
deep mulch
#

@tired vigil big
nutty

#

oh

tired vigil
#

also funny how they redesigned the ui after raycast dropped

deep mulch
#

youre not big nutty

tired vigil
spark tiger
#

wait i just noticed is this the same pfp?

tired vigil
#

nope but ig it does have kinda the same vibe

#

so many people have told me I remind them of big nutter

deep mulch
#

small nutty

supple whale
#

LOL

#

WTF?

tired vigil
#

maybe I'm just typing it wrong idk

supple whale
#

nah they flat out removed it

tired vigil
#

💀

#

looks like you can create your own time format which will be displayed in the list

#

natural language input is so much nicer than having to configure Da\y nu\mber yourself

supple whale
#

the plugin existed but was removed

#

idk why

#

the plugin let u do & 10 am PST to UTC

spark tiger
#

yay the vibecode is working

tired vigil
spark tiger
#

next step is going to be do some hooking valorant

#

um okay

#

amazing

spark tiger
#

istg if i received this id never contribute to oss ever again mending_love

valid jetty
#

@hoary sluice hmmmmmmmmmmm

deep mulch
#

@valid jetty is secretly theo

frosty skiff
spark tiger
frosty skiff
spark tiger
frosty skiff
spark tiger
#

i don’t think u can even like gain velocity higher than sprinting by bhopping in val

shrewd canopy
deep mulch
spark tiger
#

this is so over i think i didn’t get into zed windows alpha test broken_love

tired vigil
#

or just compile the source urself

spark tiger
tired vigil
#

oh I didn't even know they had something like that
I just thought it was kinda secret that it actually works fine on windows and everyone was pretending that it doesn't

#

I got it from scoop myself

deep mulch
#

winget

spark tiger
#

actually i found this out by pure accident lol

#

my font broke in zed after a recent update so i went to their #windows to see if anyone has reported anything similar lately and found out they’re doing a windows alpha lol

tired vigil
#

Ohhh 😭

#

I did hear abt that issue, but I don't use it regularly so I didn't even notice anything wrong w/ the font

#

Btw is it possible to configure zed to run rust-analyzer all the time instead of just after saving? (like how jetbrains products do it)

#

The only way I found was to set up automatic file saving to once per second
Which is kinda weird cuz like what if I don't want to save the file (but ig jetbrains also does that by default)

ornate quiver
placid cape
#

or for what

valid jetty
#

iterator environments use Box yeah

#
use std/iter/core;
global pub;

struct Intersperse<T, AnyEnded> {
    Iterator<T, AnyEnded> base,
    Option<T> next,
    T separator,
    bool emit
}

fn Iterator::intersperse<T, AnyEnded>(
    Iterator<T, AnyEnded> self,
    T separator
) -> Iterator<T, SingleEnded> {
    Intersperse<T, AnyEnded> intersperse = Intersperse {
        base = self,
        next = Option::None(),
        separator = separator,
        emit = false
    };

    return Iterator {
        env = Box::new(intersperse).to_ptr(),
        next = fn(Intersperse<T, AnyEnded> *env) {
            if env.emit {
                env.emit = !env.emit;
                env.next = env.base.next();
                return env.next.map_with(fn(_, env) env.separator, env);
            }

            val := env.next.or_else_with(fn(env) env.base.next(), env);

            if val.is_some() {
                env.emit = !env.emit;
                env.next = None();
            }

            return val;
        },
        next_back = nil
    };
}
#

the iterator itself is just a struct that holds some void*

struct Iterator<T, AnyEnded> @nofmt {
    // type erasure to prevent super nested chains
    // of iterators having really long generics
    void *env,
    fn(void *) -> Option<T> next,
    // !! nil if iterator is not DoubleEnded !!
    // unfortunately no good way to enforce this
    // than to use an Option<T> but that has its
    // own downsides and isnt always ideal
    fn(void *) -> Option<T> next_back
}
#

so technically they dont need to be boxed

#

but since elle has a gc, boxing is the neatest solution

deep mulch
#

@valid jetty rewrite elle in assembly

lavish cloud
ornate quiver
#

tbf kotlin coroutines can be scary too

deep mulch
#

a bit

#

@ornate quiver i still dont understand some coroutines stuff trolley

ornate quiver
#

me neither

deep mulch
#

wrong youre the expert

frosty skiff
deep mulch
frosty skiff
jade stone
#

@deep mulch working js native code

deep mulch
ornate quiver
#

the nix police are coming for you @deep mulch

hoary sluice
#

why doesnt it show the exit code

spark tiger
#

so you might have heard about some other complains abut font

#

but currently it’s really bad

hearty lintel
jade stone
hearty lintel
#

i havent heard of boxing a value before but im not very good at pro-gaming

tired vigil
valid jetty
#

making the iterator does

hazy pine
#

whats even the use of box

valid jetty
#

wdym

#

like the use in general or the particular use here?

hazy pine
#

like in general

valid jetty
#

neat heap allocation

#

instead of

ptr := #alloc(Foo);
*ptr = Foo { x = 1 };
``` you just do ```rs
Box::new(Foo { x = 1 });
#
struct Box<T> @nofmt {
    T *value
}

fn Box::new<T>(T value) -> Box<T> {
    ptr := #alloc(T);
    *ptr = value;

    return Box {
        value = ptr
    };
}
#

typically boxing in memory safe languages is described as putting something into heap memory safely

#

like java, rust

#

elle is not memory safe so Box is just a convenience module

deep mulch
#

@valid jetty

valid jetty
#

hiiiii

alpine pecan
#

cute

valid jetty
#

you can box a struct if you want a circular reference

#

1 year ago..

#

box is the simplest container there is

#

there’s more complex ones like Rc, RefCell, UnsafeCell, etc

lavish frigate
#

Someone found it lmao

ashen lance
lavish frigate
ashen lance
solemn ravine
winged mantle
austere idol
hazy pine
crude star
#

why use a box when you can use a vec with one element

#

its a lot more useful because you can put more things in it if you want

valid jetty
#
struct Node {
    Option<Box<Node>> left,
    Option<Box<Node>> right,
    i32 value
}
crimson sparrow
valid jetty
#

nop

hazy pine
valid jetty
#

Option<T> holds an owned T value

#

so the size would be infinite

crimson sparrow
# valid jetty nop

Worded my question badly, is that a no it wouldnt compile or a double negative? :)

valid jetty
#

it would not compile

valid jetty
crimson sparrow
#

oh icic

valid jetty
#

you end up with

struct Node {
    struct Option<Node> {
        struct Node { … },
        bool is_some
    } left,
    …
}
#

Box<T> adds indirection

#

and you can’t have that that in rust without the either a Box or a reference, but a reference requires a lifetime

#

well you can use a refcell but that has a different purpose

ivory heath
lavish frigate
#

Yep lmfao

austere idol
#

lisp is memory safe

runic sundial
#

But like

#

Their project pivoted into AI slop

runic sundial
#

-Electron

#

pretty much

austere idol
runic sundial
austere idol
#

venditor

austere idol
#

i wonder why

lavish frigate
# runic sundial Their project pivoted into AI slop

lifecycle of a current day product:
conception -> forming basic ideas -> coming out with the project -> promising a ton of stuff -> making a good product that works -> REALISE YOU CAN SELL OUT TO AI -> ADD A BUNCH OF AI GARBAGE -> PRODUCT SUFFERS MASSIVELY -> SELL OUT TO INVESTORS FOR THAT FINAL PAYCHECK -> Death

runic sundial
austere idol
#

seems like zed doesnt have option to disable ai garbage

lavish frigate
#

it does

austere idol
#

so forking is the only way

lavish frigate
#

just not all of it

#

unless they updated the settings names or added more this works nicely

{
  "features": {
    "edit_prediction_provider": null
  },
  "collaboration_panel": {
    "button": false
  },
  "chat_panel": {
    "button": "never"
  },
  "assistant": {
    "enabled": false,
    "version": "1",
    "button": false
  },
  "show_edit_predictions": false,
  "edit_predictions": {
    "enabled_in_assistant": false,
    "disabled_globs": ["**"]
  }
}
#

the only remnant of ai will be this at the bottom right but i mean its only like 30px² on your screen

lavish frigate
#

☹️

austere idol
#

how to disable that "collaboration_panel" entirely, i force denied it in calling home

lavish frigate
#

That’s beautiful

austere idol
lavish frigate
#

ah

austere idol
tired vigil
runic sundial
#

Anyway

#

Hop on JetBrains

tired vigil
#

jetbrains so heavy 😩

runic sundial
#

Ok

#

Get more ram

#

And more cpu

tired vigil
#

🙄

runic sundial
#

That's what I did.

#

All so I get to keep using IntelliJ (my beloved)

#

It can have as much ram as it wants

#

I allow it

tired vigil
#

love how jetbrains resells the same product 10 times with a different name and different default plugins

runic sundial
#

Pretty sure you can just pay one license for all of em

fleet cedar
#

Sure but that license costs 10x the license for a single one

runic sundial
#

No?

tired vigil
#

I have a school license, it's fine, but I'd prefer if there was just one blank ide that u can fully configure

runic sundial
#

You can technically

#

But the thing is, their IDEs are more than just the plugins.

#

CLion/RustRover have some native lang features which IntelliJ lacks

#

Or Rider

#

Stuff built-in for C#

#

Which is not isolated into a plugin

valid jetty
#

@hoary sluice manti sent me

hoary sluice
#

ill keep using djikast

valid jetty
#

dijkstra 2 before gta 6

deep mulch
#

@valid jetty make your own algorithm when

valid jetty
#

when i go to uni ill have a lot of free time as im very ahead so it could actually be fun to try and improve on the algorithm

#

first of all lemma 3.3 is like a pq but i feel like that can be made faster

#

and the algorithm is recursive

valid jetty
#

i feel like an iterative rewrite could make it much faster

crude star
#

i can optimise this by simply not needing to do pathfinding

valid jetty
#

not relevant in the academic world but relevant in real life when recursion is very heavy compared to iteration

#

i might try write it in elle

#

lol

deep mulch
#

make elle faster

valid jetty
#

nop

deep mulch
#

where are my socks

#

I'm cold

valid jetty
#

oh yeah zoot did i show you tuple destructuring

deep mulch
#

nop

valid jetty
#
use std/prelude;

// OBJECTIVE:
// Given a tree:
//      1
//     / \
//    2   3
//   /   / \
//  4   5   6
//
// Print each level on a new line:
//
// 1
// 2 3
// 4 5 6

struct Node {
    Option<Box<Node>> left,
    Option<Box<Node>> right,
    i32 value
}

fn Node::print_on_lines(Node *self) {
    i32[][] levels = [];
    queue := [$(self, 0)];

    while !queue.is_empty() {
        node, level := queue.remove(0).unwrap();

        if levels.len() == level {
            levels.push([i32;]);
        }

        levels[level].push(node.value);

        if _, left := node.left {
            queue.push($(left.to_ptr(), level + 1));
        }

        if _, right := node.right {
            queue.push($(right.to_ptr(), level + 1));
        }
    }

    return levels
        .map(fn(level) level.join(" "))
        .join("\n");
}

fn main() {
    root := Node {
        left = Option::Some(Box::new(Node {
            left = Option::Some(Box::new(Node {
                left = Option::None(),
                right = Option::None(),
                value = 4
            })),
            right = Option::None(),
            value = 2
        })),
        right = Option::Some(Box::new(Node {
            left = Option::Some(Box::new(Node {
                left = Option::None(),
                right = Option::None(),
                value = 5
            })),
            right = Option::Some(Box::new(Node {
                left = Option::None(),
                right = Option::None(),
                value = 6
            })),
            value = 3
        })),
        value = 1
    };

    $dbg(root);
    $println('\n', root.print_on_lines());
}
#

look at print_on_lines, its a bfs

#

WHY HUSK

#

actually hold on those Option:: dont need to be there

#
fn main() {
    root := Node {
        left = Some(Box::new(Node {
            left = Some(Box::new(Node {
                left = None(),
                right = None(),
                value = 4
            })),
            right = None(),
            value = 2
        })),
        right = Some(Box::new(Node {
            left = Some(Box::new(Node {
                left = None(),
                right = None(),
                value = 5
            })),
            right = Some(Box::new(Node {
                left = None(),
                right = None(),
                value = 6
            })),
            value = 3
        })),
        value = 1
    };

    $dbg(root);
    $println('\n', root.print_on_lines());
}
#

i feel like you guys are husking the wrong thing, im talking about this

#

node, level := queue.remove(0).unwrap();

spark tiger
#
{
  "disable_ai": true
}
spark tiger
#

though i've never used it and i'm not sure if it's actually any good

#

i feel so stupid struggling to figure out how to include detours.h in my c++ file 😭

#

why does it need to be so complicated like why can’t i just do cpp add detours

crude star
#

u literally #include "detours.h"

austere idol
#

yes it works

#

even that button is gone

spark tiger
austere idol
crude star
#

skill issue

#

where is the file

spark tiger
#

fuck if i know isob

#

idk how to get it

#

like

#

where am i supposed to get it

alpine pecan
#

at the long cpp shop

crude star
#

ngmi

spark tiger
#

oh

crude star
#

get vcpkg

spark tiger
#

why did they put it in readme.txt

#

ffs

#

and in samples/

crude star
#

its linked in the readme

alpine pecan
pearl stagBOT
spark tiger
#

./bootstrap-vcpkg.sh
okay wires

#

why do i need to use bash for a windows lib idgi isob

crude star
#

honestly idfk why do you even need this repo

#

its ancient

spark tiger
#

yeah no it's fucking crazy that's how you install a library manager in 2025

crude star
#

2019*

spark tiger
#

it didnt even put it in path apparently...

alpine pecan
#

scoop install vcpkg

spice token
spark tiger
#

this is so funny even their own package manager doesnt have it isob

spark tiger
#

anyways just installed it with scoop

spark tiger
#

vcpkg
cmake
nmake
ninja
what else do i fucking need to just use detours jesus fucking christ 😭

deep mulch
#

gradle blobcatcozy

spark tiger
#

what else does it need oh my god why is it so difficult

spark tiger
#

yet it says something like oh you need nmake

#

oh you need ninja

#

oh you need mingw makefiles

#

why does it need to be so fucking complicated

#

i managed to obtain detours.h file without any of this tho

#

grabbed it from vcpkg's installed folder

hearty lintel
#

is everyone here using zed

shrewd canopy
#

I use VSCode

lavish frigate
#

i also use vscode

small sky
#

Idk if this is the right channel, is there any plugin that sorts the items in those thread-like channels based on reaction count

elder yarrowBOT
small sky
#

Alright sorry

spark tiger
fleet cedar
spark tiger
frosty skiff
#

polyhook on top!!!

spark tiger
#

i only know minhook & detours

frosty skiff
spark tiger
#

cool ass pfp lmao

jade stone
frosty skiff
#

what are u even hooking

jade stone
spark tiger
frosty skiff
jade stone
frosty skiff
#

ya and polyhook is easier to work with because its made by a normal person and not the cucks at microsoft lol

jade stone
spark tiger
vast musk
#

is there any way to turn off recent activity without just turning everything off ShiggySad

frosty skiff
jade stone
jade stone
frosty skiff
#

yea

#

maybe ill port polyhook to arm sometime

vast musk
jade stone
#

But my main windows machine is an arm64 laptop so ineed that support

frosty skiff
#

asmtk and asmjit dont support arm i think tho

#

yea ngl arm windows just sounds wrong

vast musk
jade stone
shrewd canopy
spark tiger
supple whale
#

nooo

spark tiger
#

like genuinely if not apple with m-series i don’t think we’d ever see so many apps being ported to arm

supple whale
#

snap dragon is

spark tiger
#

at least in near future

supple whale
#

apple is the best in software support for arm

#

nooo

#

android is

#

hmmm

#

apple is good at top end arm hardware i guess

#

sd beats apple in power efficiency and low-power compute, but it can't reach the same speeds that the new m4 chips can

#

but yeah windows for arm is an insanely good thing

#

not for windows, but for the software support for arm

#

because arm is fucking goated, and not enough software supports it

spark tiger
#

i’m curious if base m4 is faster than my cpu touch for like build time

supple whale
#

apple's m4 can beat almost all intel xeons

#

its not a joke, shit's powerful

shrewd canopy
supple whale
#

in what it accomplished thus far?

#

sure

#

in its future?

#

no

spark tiger
supple whale
#

not being x64

#

its actually that simple

#

but for the most part its the power efficiency

#

arm is a LOOOOOOT more power efficient

#

and its not even close

frosty skiff
spark tiger
supple whale
#

there's a lot of reasons for that, for the most part its because of the more modern instruction set

supple whale
frosty skiff
#

yea

spark tiger
#

@grok what is risc

supple whale
#

it took us 30 minutes to compile our chromium build on a 72 core xeon server, it took 60 minutes on an m4 chip

crude star
#

have you ever seen an arm opcode list

supple whale
#

the server pulled over 1300W btw

crude star
#

tell me its still risc

spark tiger
supple whale
#

yeah

#

2 times slower

#

versus a fucking 72 core server that pulls 1300W

spark tiger
#

oh

#

72 cores lmao

frosty skiff
supple whale
#

m4 has 10 cores...

#

and pulls like max what... 130W? 120W?

#

x10 less?

spark tiger
#

hmm what kind of project can i build to compare build time

supple whale
#

chromium

frosty skiff
#

llvm

spark tiger
frosty skiff
#

the jvm is good too

shrewd canopy
frosty skiff
#

build openjdk

supple whale
spark tiger
#

also preferably something in rust so it’s just cargo build instead of some cursed shit

frosty skiff
#

zed

shrewd canopy
spark tiger
# frosty skiff zed

i think it wouldn’t be fair to since they use different dependencies for each system i believe

frosty skiff
#

yea most do

crude star
#

i don't forgive intel and amd for both being idiots and splitting the x86 specification into 2

supple whale
#

XD

#

there are so many vers its unfunny

crude star
#

they're from the same company at least ... right?

#

meanwhile intel only owns 32bit x86 while amd owns x86-64

jade stone
deep mulch
#

cattery

#

🐱 🔋

valid jetty
#

@hoary sluice opinions

onion Foo {
    A(i32),
    B(string),
    C(i32[])
}

-# #size(Foo) == max(#size(i32), #size(string), #size(i32[]))
unwraps to

enum __Foo_tag {
    A,
    B,
    C
}

struct Foo {
    __Foo_tag _tag,
    i32 *A,
    string *B,
    i32[] *C
}

then you can

if Foo::A(value) = x {
    $dbg(value);
}

and it unwraps to

if x._tag == __Foo_tag::A {
    value := x.A;
    $dbg(value);
}
hoary sluice
valid jetty
#

tagged union yea

winged mantle
#

🧅

hoary sluice
deep mulch
#

what does taht do

lavish frigate
#

bro has not discovered the joys of pattern matching yet 😹

valid jetty
lavish frigate
#

i hope this makes sense

deep mulch
#

husk

#

if x is Foo {
// compiler knows its foo
}

lavish frigate
#

well the if statement checks if x is specifically of Foo::A and x would still be assigned to some Foo so that syntax wouldnt make a lot of sense

#

overwriting a variable like that sucks

deep mulch
#

wouldnt it just be an assertion

#

variable isnt overwritten, only compiler knows its that type

lavish frigate
#

nott really, Foo::A(value) and value are 2 different things, Foo::A holds the value, they are of different type and value

#

again not sure if im explaining this in an understandable manner

#

ive written enough rust to the point where i just do and dont think so i forget the details 🔥

deep mulch
#

o

#

maybe

#

ive only barely used rust

placid cape
#

our government wants to set maximum walking speed 💀

tired vigil
#

well at what point does walking turn into running

tired vigil
lavish frigate
#

and i love pattern matching

tired vigil
#

you can just put in some values and then take them out again... no one can stop you

struct Test(isize, isize);

fn main() {
    let Test(a, b) = Test(1, 2);
    println!("{}", a + b);
}
lavish frigate
#

im like ai bros but instead of ai i preach pattern matching

#

what if we used pattern matching in... uh.... mod and use..!!!

tired vigil
#

well use idk::{a, b} is kinda similar...

lavish frigate
#

use idk::*;

hoary sluice
hoary sluice
limpid mica
#

minimum walking speed

deep mulch
#

🦅ly

valid jetty
#

@hoary sluice i improved the generic inference

#

now i can pass Iterator::empty() and infer the generics based on what .__iter__ returns

#

and match rust's behavior

jade stone
#

i love storing images

deep mulch
jade stone
#

@valid jetty why husk

valid jetty
valid jetty
jade stone
valid jetty
#

hop on

struct {
    uint32_t width, height;
    std::vector<uint32_t> pixels;
} iconData
jade stone
#

i should

deep mulch
#

@valid jetty @valid jetty @valid jetty

valid jetty
#

zoot pings me every 2 seconds

jade stone
#

c++ my beloved

#
        Napi::Uint8Array arr = Napi::Uint8Array::New(env, value.size());
        memcpy(arr.Data(), value.data(), value.size());
        return arr;
supple whale
#

also chad napi user

jade stone
#

but it was a bit annoying to setup

supple whale
#

wtf is cmakejs

jade stone
#
execute_process(COMMAND node -e "f = require('fs');n=require('node-addon-api').include;f.writeFileSync(1, n.substring(1, n.length-1, 'utf-8'))"
  OUTPUT_VARIABLE NAPI_PATH
)
jade stone
supple whale
#

yeah i dont think you need to serialize it manualyl as uint8

jade stone
supple whale
#

i havent written much napi

#

but i know memcpy is 100% wrong there

jade stone
supple whale
#

not even that

#

its dogshit for performance

#

yeah

#

napi_create_uint32

jade stone
#

im using c++ wrapper blobcatcozy

supple whale
#

so its good as a reference

jade stone
#

@supple whale

supple whale
#

napi_create_uint32...

#

its a fucking NAPI built in function

#

and its x10000 faster than that

#

its a built in macro

jade stone
#

not an uint32 array

supple whale
#

fuck wrong one

#

you're right

#

wait i read the code giga wrong

#

1 sec

#

wait is this documented wrong?

jade stone
#

the perf on this is prob fine

#

it's not like it matters anyway

supple whale
#
Napi::ArrayBuffer arrayBuffer = Napi::ArrayBuffer::New(
    info.Env(),
    nativeArray->data(),
    arrayLength /* size in bytes */,
    [](Napi::Env /*env*/, void* /*data*/, std::vector<uint8_t>* hint) {
      std::unique_ptr<std::vector<uint8_t>> vectorPtrToDelete(hint);
    },
    nativeArray.get());
nativeArray.release();

Napi::Uint8Array byteArray = Napi::Uint8Array::New(info.Env(), arrayLength, arrayBuffer, 0);
#

so yeah what u sent

#

u just didnt show the ab build

#

but i rmeember there was a faster method

jade stone
jade stone
#

lc.wa 128^2

visual shellBOT
supple whale
#

ah yeah i remember now

#

you pass a buffer, and use the pointer of that buffer in C

#

yeah the ab new probs will work fine

#

napi is great, but its horrendously easy to write performance destroying code with it

#

and its horrendously difficult to profile

#

i wasted many hours trying to profile napi code

royal nymph
ivory heath
#

Sure technically the original x86 and amd 64 are owned by both respectively but they have perpetual licenses from each other

royal nymph
#

GitHub and its leadership team will continue its mission as part of Microsoft’s CoreAI organization

ivory heath
#

Intel makes extensions to amd64

royal nymph
#

have we reached the extinguish part

ivory heath
#

More annoyingly avx-512 is like 12 sub extensions with a baseline profile that does not include them all yet it’s “avx-512”

ivory heath
frosty skiff
ivory heath
# ivory heath It’s not the ISA it’s the chip design. The only actual advantage arm has is bet...

Here is a guy who actually knows what he’s talking about with the primagen on a live stream https://youtu.be/xCBrtopAG80?si=injFRQpuLE5oI5z0

Recorded live on twitch, GET IN

Article

https://hackaday.com/2024/03/21/why-x86-needs-to-die/

Guest

https://twitter.com/cmuratori

My Stream

https://twitch.tv/ThePrimeagen

Best Way To Support Me

Become a backend engineer. Its my favorite site
https://boot.dev/?promo=PRIMEYT

This is also the best way to support me is to supp...

▶ Play video
ivory heath
#

Arm has a butt load of complex instructions used all the time

frosty skiff
#

I mean, isn't stuff like the load/store architecture still maintained, and most of the core instructions are a lot more simple compared to x86

crude star
#

marketing

deep mulch
#

causing an avx512 instruction error in the jvm was funny

#

i will treasure this memory

ivory heath
#

The actual limitation of modern CPUs is instruction throughput

#

RISC adds absurd levels of overhead

jade stone
frosty skiff
supple whale
#

still not the correct way of doing it

valid jetty
#

the only thing i can think of is multiple loads for the hi and lo bits of a big integer literal into registers because instruction sizes are constant

placid cape
#

better dijkstra

frosty skiff
placid cape
ivory heath
valid jetty
placid cape
#

you already talked about it?

valid jetty
limpid mica
placid cape
valid jetty
placid cape
#

yea yea

ivory heath
#

Let’s create a hypothetical.

Let’s say we want to count the number of 1 bits in a uint64.

A primative way of doing so would % 2 the number, check if it 1 or not yada yada.

The cpu has to decode every single instruction of the loop to execute our code. This also means that for the most part the scheduler itself cannot run operations to perform it quicker in parallel because it has limited reasoning capabilities and only has a short sight into the future.

If the cpu had an instruction to do this for us it could easily do it in one cycle because internally it has context of the problem.

Modern CPUs, if we make this a for loop don’t literally decode each instruction one by one and have a cache of decoded instructions in l1, but it would still be slower to look up what to do in l1 instead of it being implemented internally in the CPUs byte code itself

#

We want to saturate as much of the cpu as possible and we do that by compacting as much compute into one instruction

#

Multiple simple cores add overhead EX more decoders to do this so having thousands of little arm cores isn’t more efficient either

#

Intel partially tried to get around making smaller but still fast cores with rentable units till they scraped it

frosty skiff
#

so you're saying the decode overhead of simple instructions & the inability to optimise certain patterns makes RISC less efficient then having specialised instructions even if they make the ISA more complex?

ivory heath
#

Yes

#

Adding instructions is cheap as shit

#

Most of a modern CPUs is NOTHING but l1-3 cache and the schedule trying to saturate the core as much as possible

#

Intel TRIED to avoid this with itanium

#

You encoded multiple, up to 8 instructions into one very long one and it would execute them all in parallel in one cycle

#

Instruction count means jack shit

ivory heath
frosty skiff
ivory heath
#

That take up power and die space yes.

#

Schedulers are so convoluted and fucked up that Intel alderlake can unroll loops AT RUN TIME IN HARDWARE

#

Intel and AMD both have massive power hungry schedulers and pipelines to try and eak out as much performance as possible. Even down to the per transistor level have gaps between what TSCM calls "gadgets" to make sure they don't overheat at the ridiculous clock speeds they're ran at.

#

arm takes a step back and sacrifices throughput for in some cases complex instructions. EX: what apple and the arm company is trying to do with matrix operation instructions.
Or in general have less power heavy overhead for simple tasks that are normally memory bound like serving a website

#

hence where they get power efficiency from.

#

nothing to do with ISA

ivory heath
#

apple is interesting as they just throw l1 cache and instruction decoders at the problem with a shallow but wide pipeline

#

M series cpus still lack single core performance despite being generation(s) ahead of x86 in actual silicon nodes

supple whale
#

im giga excited for the near future of SD processors

#

and with the VERY rapidly growing support for ARM its gonna be nuts software side too

#

when the iphone came out it removed like 40 products off of the face of the planet because ur phone can do that

#

and i feel like the new SD chips will do that too, where ur phone will simply become your everything thats mobile

#

like a mobile console and laptop, just attach a telescopic controller or a lapdock

#

because the new SD chips are actually that powerful to be able to do that

ivory heath
#

if snapdragon finally, properly, supports UEFI

supple whale
#

it really doesnt need to

#

you're thinking of the SD laptops

#

where sure, thats a problem

#

but fuck those in the first place, just use ur phone

#

i mean the explosion in arm software support those laptops caused is sick

ivory heath
#

why would i use my phone for anything

supple whale
#

why not?

#

lol?

#

if its powerful enough, whats the reason to not do it

#

"oh yeah let me just use my x2 slower and weaker laptop?

#

just.... why?

#

use a lapdock that's 10% of the price and simply attach ur phone

#

that is... if google doesnt fuck up the display server for AVF for android

#

they already delayed it from a16

ivory heath
#

there is a lot i want to do i cant do on android without a custom rom

supple whale
#

dude

#

its full linux

#

AVF with a display server is legit just raw linux

#

you can run anything on it

ornate quiver
supple whale
#

so anything you wouldnt be able to do is a linux limitation

ornate quiver
#

i depend on root but custom rom not so much

supple whale
#

oh wait no you wouldnt be able to read the raw usb serial, i think that's protected

#

other than that, full linux

ivory heath
#

can i replace the kernel? sodalove

supple whale
#

yep.

#

its a pKVM

#

you'll likely brick it

#

but sure

ivory heath
#

and what phones support this?

supple whale
#

as of now? none because google delayed it

ivory heath
supple whale
#

but planned support is all non-samsung phones

#

with i think some exceptions for mali? from what i understood there were GPU driver issues?

#

dont quote me on that

ornate quiver
ivory heath
#

either way its still vapourware

supple whale
#

its just few people bother since its unstable

#

but people ran shit like oolama or gimp on it just fine

#

sicne its just debian with a display server

ivory heath
#

unstable, need an android i can load a custom rom on, deal with shitty gpu performance and nothing supporting arm natively still well

#

sure ill use it

supple whale
#

no you dont need a custom rom

#

its coming to normal android

#

all android phones will have it

jade stone
#

horrorcode

jade stone
ivory heath
#

not right now

supple whale
#

yeah nrn

#

but its coming

#

and the GPU support and perf is better than what you'd get from android apps

#

that much is already confirmed

#

tho its a bit lower than what the GPU can actually do because of sandboxing

#

but we dont have exact figures :(((

#

we only have a "yep its faster than bionic and android's java display server"

ivory heath
#

bionic like apples SOCs?

supple whale
#

no, bionic like android's native C libraries that are called bionic

#

or cpp?

#

i dont remember

ivory heath
#

ah

supple whale
#

and considering you can already run shit like cyberpunk 2077, witcher 3 and crysis remastered at 60 fps on bionic

#

i cant imagine how good raw linux will be

#

without the android bullshit

#

well 2077 runs at like 30 fps on lowest

#

but it runs

ivory heath
#

still vapourware and i dont have an android sodalove
Might look into it except i dont wanna murder my phones battery in months and or have it attatched to a fake laptop with a dongle

supple whale
#

yeah for now it is

#

once it releases in a few months its gonna be utterly fucking massive

#

some people from ltt said that framework might entertain the idea of a lapdock

#

and a lapdock from them would fuck

ivory heath
#

active cooling for your phone.

supple whale
#

but yeah i agree battery murdering is real, lapdocks come with their own batteries u can charge the phone with

#

and most high end phoens nowdays support charge bypass

#

so it wont touch the battery

#

so that kinda unfucks it

ivory heath
#

the heat exposure will still kill them

supple whale
#

and then it starts throttling

supple whale
#

but i agree, it is a potential problem

#

still, not that it matters much

#

with how much money you wont be spending on an actual laptop or mobile console like steam deck, you could simply afford to change the phone every 3 years XD

#

thats what kinda excites me

#

since you lapdock or telescopic controller wont become obsolete all of a sudden

#

like the phones hardware can and will

jade stone
#

horrorcode

IconData WindowContext::getWindowIcon() const {
    Atom actualType;
    i32 actualFormat;
    u64 nitems;
    u64 bytesAfter;
    u8* propRet;
    IconData ret;

    if (XGetWindowProperty(display.get(),
                           window,
                           atoms._NET_WM_ICON,
                           0,
                           -1,
                           False,
                           XA_CARDINAL,
                           &actualType,
                           &actualFormat,
                           &nitems,
                           &bytesAfter,
                           &propRet)
        == Success) {

        if (propRet && nitems > 0) {
            std::println("actualType: {}, actualFormat: {}, nitems: {}, "
                         "bytesAfter: {}",
                         actualType,
                         actualFormat,
                         nitems,
                         bytesAfter);
            auto data = (u64*)propRet;
            ret.width = *data++;
            ret.height = *data++;
            ret.data.resize(ret.width * ret.height);
            // turn argb -> rgba
            // we would need to do this in js anyway, so might as well do it
            // here where it will be faster
            for (size_t i = 0; i < ret.data.size(); i++) {
                ret.data[i] = argbToRgba(*data++);
            }
        }
    }
    return ret;
};
supple whale
#

but yeah, for now vapourware

#

and its annoying me because google was meant to release it with android 16 and fuckign didnt

#

they shipped the pKVM linux shit with full debian and networking

#

but didnt ship the fucking display server

#

REEEEEEEEEEEE

ivory heath
#

sodathink I think intel is going to die but i hope they keep doing stuff with little cores because this 200 USD walmart special laptop with the N305 is pretty fucking bangin

supple whale
ivory heath
#

the only limiting factor on it is 8GB of ram else outside of gaming why tf would i need better

supple whale
#

because these arc cards FUCK

ivory heath
supple whale
#

fuck x86, arm!

#

XD

#

but yeah no i agree lack of competition bad

ivory heath
#

x86 isnt going anywhere. itanium didnt kill it

supple whale
#

some china company is probably gonna buy out intel

#

once its starts dyng

crude star
#

itanium was x86

ivory heath
#

?

supple whale
#

show it

ivory heath
ivory heath
#

why are you storing it as interlaced instead of planar tho

#

this isnt YUV

supple whale
#

oh its a single position

#

i thought it was a bitmap

#
void decodeBitmap(double alpha, size_t *data, ASS_Image *img, int w, int h) {
  uint32_t color = ((img->color << 8) & 0xff0000) | ((img->color >> 8) & 0xff00) | ((img->color >> 24) & 0xff);
  uint8_t *pos = img->bitmap;
  uint32_t res = 0;
  for (uint32_t y = 0; y < h; ++y, pos += img->stride) {
    for (uint32_t z = 0; z < w; ++z, ++res) {
      uint8_t mask = pos[z];
      if (mask != 0)
        data[res] = ((uint32_t)(alpha * mask) << 24) | color;
    }
  }
}
#

mine was that

#

i suck at c++ but that was the best i came up with

jade stone
#

i'm just going to be using this on the js side

crude star
#

huh was IA-64 not intel's attempt at 64bit x86 or am I mixing up something

ivory heath
#

it wasnt X86 it was something new

supple whale
ivory heath
#

not RISC or CISC it was EPIC

supple whale
#

its one of the few things that can crash chromium

#

imagedata

#

when constucting imagedata you gotta check the CPU arch

ivory heath
#

intel foresaw the hellscape we live in with modern FAT cpu cores and tried to avoid it making cores clock high with high IPC

supple whale
#

because if its 32bit arm you'll crash chromium if you use references of uint8

supple whale
#

haha

#

you're telling me?

#

im the one that found that bug, took me fucking 3 months to track down why 5% of my userbase was crashing

#

and its still not fixed

jade stone
#

LMAO this compiles down to a single instruction

ivory heath
#

yeah computers are smart

supple whale
# jade stone insane
const data = hasBitmapBug 
  ? self.HEAPU8C.slice(pointer, pointer + reassigned.w * reassigned.h * 4) 
  : self.HEAPU8C.subarray(pointer, pointer + reassigned.w * reassigned.h * 4)
promises.push(createImageBitmap(new ImageData(data, reassigned.w, reassigned.h)))
#

oh yeah

#

there are 2 bugs with imagedata

#

the segflaut, and the incorrect pointer reference

ivory heath
# jade stone

by the way this is over engineered

inline uint32_t argb_to_rgba(uint32_t argb) {
    return ((argb & 0x00FFFFFF) << 8) | ((argb >> 24) & 0xFF);
}
supple whale
#

i always loose it

ivory heath
#

its compiler explorer

supple whale
#

cool

#

not a link

ivory heath
supple whale
supple whale
#

XD

ivory heath
# jade stone

send me your function please im to lazy to type it out and i wanna benchmark it

jade stone
#

#include <cstdint>
uint32_t argbToRgba(uint32_t argb) {

return ((argb & 0xFF000000) >> 24) |  // A
       ((argb & 0x00FF0000) >> 8) |   // R
       ((argb & 0x0000FF00) << 8) |   // G
       ((argb & 0x000000FF) << 24);   // B

}

uint32_t argbToRgba2(uint32_t argb) {
return ((argb & 0x00FFFFFF) << 8) | ((argb >> 24) & 0xFF);
}

supple whale
#

yabe

#

nvm idiot

ivory heath
supple whale
#

forgot o0

#

not great not terrible

#

i wish i could profile wasm like i can profile js

#

DWARF just doesnt fucking work

ivory heath
#

im trying to benchmark this shit but clang optimized out all the code.

supple whale
#

isnt there a spreadsheet of clock cycles for given instructions?

#

u could simply check how many clocks the instructions take vs eachother

ivory heath
#

i guess.... i wanted real world performance tho

supple whale
#

i remember doing that for 8080 ages ago

supple whale
ivory heath
#

??????

#
argbToRgba: 1.51251e+06 us, checksum=2147464837549209034
argb_to_rgba: 919292 us, checksum=2147518598361242314
#

why isnt the total the same

#

cause....

#

@jade stone the functions name is wrong this isnt to RGBA its BGRA

#

thats why it uses a bswap

#

idk why i didnt realize that earlier

supple whale
#

shit bro I need to get u to look at my entire C++ codebase and unfuck it

ivory heath
#

so is the name wrong

#

or is the code wrong?

jade stone
#

no

#

code wrong

ivory heath
#

use this then and be happy

uint32_t argb_to_rgba(uint32_t argb) {
    return ((argb & 0x00FFFFFF) << 8) | ((argb >> 24) & 0xFF);
}
jade stone
#

never happy with snake_case

ivory heath
#

rename it IDGAF

jade stone
#

yeah

#

i did end up using that

ivory heath
#
#include <cstdint>
#include <chrono>
#include <iostream>
#include <vector>
#include <random>

// First version
uint32_t argbToRgba(uint32_t argb) {
    return ((argb & 0xFF000000) >> 24) |  // A
           ((argb & 0x00FF0000) >> 8)  |  // R
           ((argb & 0x0000FF00) << 8)  |  // G
           ((argb & 0x000000FF) << 24);   // B
}

// Second version
uint32_t argb_to_rgba(uint32_t argb) {
    return ((argb & 0x00FFFFFF) << 8) | ((argb >> 24) & 0xFF);
}

template <typename Func>
void run_benchmark(const char* name, Func func, const std::vector<uint32_t>& data) {
    auto start = std::chrono::high_resolution_clock::now();
    uint64_t sum = 0;
    for (uint32_t px : data) {
        sum += func(px);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::micro> elapsed = end - start;
    std::cout << name << ": " << elapsed.count() << " us, checksum=" << sum << "\n";
}

int main() {
    constexpr size_t N = 1000000000;
    std::vector<uint32_t> pixels(N);

    std::mt19937 rng(12345);
    std::uniform_int_distribution<uint32_t> dist(0, 0xFFFFFFFF);
    for (auto& px : pixels) {
        px = dist(rng);
    }

    run_benchmark("argbToRgba", argbToRgba, pixels);
    run_benchmark("argb_to_rgba", argb_to_rgba, pixels);
}
#

technically overkill

#

i dont care.

supple whale
#

@ivory heath wanna fix my C++ code and the build system for the wasm it's made for?

#

I'll pay ya XD

ivory heath
#

if youre doing ANYTHING with image scaling or conversion use ZIMG please. It uses Z.lib under the hood and is basically the fastest way to do anything....
except it uses planar RGB because interlaced is cursed
https://github.com/sekrit-twc/zimg

ivory heath
supple whale
#

gg

jade stone
#

i think i just encountered a vite bug fr

jade stone
#

what the hell is a f16

i thought all floats were either 32 or 64 bits

austere idol
#

for comparsion, f32 has 8 exponent and 23 fraction bits

austere idol
#

also, 8-bit and 4-bit floats exist

ornate quiver
#

1 bit float only representing 0 and inf

hoary sluice
hoary sluice
#

whats preventing me from making a 128 bit float

winged mantle
#

make your code run very slow

struct integer {
    bool b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31;
};
#

and quadruple memory usage

lavish frigate
#

Gonna pr to rust and make arrays 1 indexed

valid jetty
lavish frigate
#

😊

valid jetty
#

did it actually

#

ok but old rust had classes

lavish frigate
#

ya

valid jetty
#

lol

lavish frigate
#

Yes

#

Rust went through quite the identity crisis in its early years

valid jetty
#

elle is doing the same though it’s slowly just turning into rust lol

lavish frigate
#

Well GC Rust is cool but so is having a borrow checker… it’s clear that a borrow checker provides a bunch of benefits (or detriments for some use cases) it would be nice to have a more varied selection of languages using a borrow checker

#

But it’s your project and at the end of the day you choose what u wanna do with it

valid jetty
#

there is inko

valid jetty
lavish frigate
#

That’s true

tired vigil
valid jetty
#

yeah

#

before mozilla got their hands on it

limpid mica
ivory heath
#

Below that it does not really make any sense

deep mulch
#

learning IEEE 754 and doing floats by hand made me die

limpid mica
#

4 bit floats are the minimum size where it makes sense

#

one sign bit, two exponent bit, one significand

crude star
#

4 bit can still represent -Infinity to +Infinity

#

pretty big range

ivory heath
#

I guess having exponential vs 1-6 is good for ai models….

#

But they typically use int4 cause it’s cheaper.

fleet cedar
#

1-bit is gaining popularity in vector databases, though last I heard it doesn't work well for ai

austere idol
ornate quiver
#

you dont

woeful perch
#

No embed in preview ?

austere idol
#

indentaion: 2 spaces or 4 spaces?

fleet cedar
#

And you can compute distance/similarity between 512x1 just as well as you xan with 512x32

#

Just a bit less precise

#

I don't understand the specific algorithms for binary quantization, but I hear they work pretty well considering the savings

austere idol
tired vigil
#

How is infinity even defined in floats, is that just the highest/lowest value venniethink

austere idol
#

NO!!!!!!!!!!!!!!!

jade stone
austere idol
jade stone
austere idol
#

here's our infinities

austere idol
#

i <3 spreading misinformation on internet

tired vigil
#

Oh 😭

ivory heath
frosty skiff
deep mulch
#

@frosty skiff hi

#

kotlin logoblobcatcozy

frosty skiff
#

kotlin logo true

jade stone
gilded surge
#

which horrific font is that

limpid mica
#

is that comic sans mono

gilded surge
#

i think so

hot topaz
#

i used my skills at this code

if (true) {
await Vencord.Updater.update();
(window.VesktopNative ?? DiscordNative).app.relaunch();
} else {
    console.log("no updates")
}```
#

did i cook

#

🔥

gilded surge
#

this is already in vesktop???

hot topaz
#

little edit

#

if statement

royal nymph
#

if true 🔥

ionic lake
#

needs some prototypes

#

otherwise good

hot topaz
#

tytytyty

royal nymph
#

is this good or what should I use for basic nodejs threading @supple whale

https://www.npmjs.com/package/workerpool

supple whale
#

if you mean inline threading you will wait 6 years minimum

royal nymph
supple whale
#

workerpool is for multithreading

#

not threading