PEJI.IR

Perfomance عالی در Concat

۱۴۰۱ مهر ۲۶, سه‌شنبه ساعت ۱۸:۱۶

خب با اجرا کردن

time ./dolang test/concat.do

و اجرا کردن نمونه مشابه اون در c با strcat و یا c++ string و یا quickjs متوجه تفاوت زیاد پرفورمنس میشه شد

برنامه درdolang با میانگین ۲۰۰ میلی ثانیه اجرا میشه. در حالی که با حالت های بالا از ۶ تا ۹ ثانیه اجرا میشه.

اضافه شدن Rope base string

۱۴۰۱ مهر ۲۶, سه‌شنبه ساعت ۱۵:۲۸

این قسمت رو اضافه کردم

۹۰ درصد کار انجام شده

فقط یه سری قسمت های کوچیک از String مونده که تکمیل بشه

قسمت مربوط به Regex با String جدید باید بازنویسی بشه

خیلی از قسمت ها به خصوص قسمت های مربوط به String بازنویسی شد

یه سری Operator ها از جمله Plus Equal و چند Operator دیگه رو باید تکمیل کنم. عملیات مربوط به float به غیر از plus رو هم باید انجام بدم ( plus انجام شده ) BigNum رو هم باید اضافه کنم. بعد از اون پروژه برای x86 بسته میشه و من شروع به توسعه x64 میکنم

از اوایل خرداد امسال در حال توسعه dolang هستم

Rope based string

۱۴۰۱ مهر ۲۳, شنبه ساعت ۱۲:۰۸

خب چیزی که من دنبالش بوده و ناخواسته پیاده سازیش کردم Rope based string هست

باید یک پیاده سازی خوب براش انجام بدم و داخل dolnag ازش استفاده کنم ...

پیاده سازی نهایی string

۱۴۰۱ مهر ۱۴, پنجشنبه ساعت ۱۴:۴۰

پیاده سازی نهایی به شکل زیر شد :

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	char **strings;
	int *types;
	int i;
} string;

string_init( string *str ) {
	str = malloc( sizeof( string ) );
	str->i = 0;
	str->strings = malloc( sizeof( char *) * (2) );
	str->types = malloc( sizeof( int *) * (2) );
	return str;
}

string_concat( string *a, string *b) {
	string *r;
	r = string_init( r );
	string_append1( r, a );
	string_append1( r, b );
	return r;
}

string_append( string *str, char *str1 ) {
	str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 2 ) );
	str->types = realloc( str->types, sizeof( int *) * ( str->i + 2 ) );
	str->types[str->i] = 1;
	str->strings[str->i++] = str1;
}

string_append1( string *str, string *str1 ) {
	str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 2 ) );
	str->types = realloc( str->types, sizeof( int *) * ( str->i + 2 ) );
	str->types[str->i] = 2;
	str->strings[str->i++] = str1;
}

string_print( string *str ) {
	for( int i = 0; i < str->i; i++ ) {
		if( str->types[i] == 1 ) {
			printf("%s", str->strings[i]);
		} else {
			string_print( str->strings[i] );
		}
	}
}

string_len( string *str ) {
	size_t len = 0;
	for( int i = 0; i < str->i; i++ ) {
		len += strlen(str->strings[i]);
	}
	return len;
}

main() {

	string *str;
	str = string_init( str );

	string *str1;
	str1 = string_init( str1 );
	string_append( str1, "abc");


	string *str2;
	str2 = string_init( str2 );
	string_append( str2, "defghijklmnñopqrstuvwxyz");

	for(int i = 0; i < 30000; i++) {
		str = string_concat( str1, str );
		str = string_concat( str, str2 );
	}

	string_print( str );
}

این خروجی با همون performance کامپایلر v8 هست.

strings

۱۴۰۱ مهر ۱۴, پنجشنبه ساعت ۹:۲۰

مبحث string و مباحث مربوط به اون ( به طور مثال concat ) خیلی مهم هست که پرفرمنس خوبی داشته باشه

بهینه سازی در این قسمت خیلی مهم هست و باید حتما انجام بشه

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	char ** strings;
	int i;
} string;

string_init( string *str ) {
	str->i = 0;
	str->strings = malloc( sizeof( char *) * (1002) );// = malloc( 999999999 );
}

string_append( string *str, char *str1 ) {
	if( str->i % 1000 == 0 ) {
		str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 1002 ) );
	}
	
	str->strings[str->i++] = str1;
}

string_print( string *str ) {
	for( int i = 0; i < str->i; i++ ) {
		printf("%s", str->strings[i] );
	}
}

string_len( string *str ) {
	size_t len = 0;
	for( int i = 0; i < str->i; i++ ) {
		len += strlen(str->strings[i]);
	}
	return len;
}

main() {

	string *str;
	string_init( str );

	char *str1 = "abc";
	char *str2 = "defghijklmnñopqrstuvwxyz";

	char *nstr = malloc( strlen(str1)+strlen(str2)+1 );
	strcat(nstr, str1);
	strcat(nstr, str2);

	for(int i = 0; i < 30000; i++) {
		string_append(str, nstr);
	}

	string_print( str );
	printf("\\n");
	printf("%d\\n",  string_len( str ) );
}

در یکی از مباحثی که در quickjs در مورد اون بحث شده. مقایسه performance در nodejs و qjs برای یک مثال هست.

خب من خیلی این قسمت رو تست کردم تا به این پیاده سازی نهایی رسیدم تا پرفورمنسی برابر با nodejs داشته باشم.

این پیاده سازی رو برای dolang هم باید انجام بدم.

البته یک چیز دیگه ای هم من توی ذهنم دارم که اون رو هم باید تست کنم. ( ویرایش: بهترین راه حل همین راه حلی هست که بالا گفتم ...)

ادامه زبان

۱۴۰۱ مهر ۱۰, یکشنبه ساعت ۷:۲۱

یکی از کارهایی که بعدا باید انجام بدم چون دسترسی به سیستم هم ندارم اینجا میگم

باید malloc رو تنها یکبار انجام بدم و مقداری رم رو رسرو کنم، چون با هر بار صدا زدن اون پرفورمنس کار خیلی پایین میاد،

اینکار رو باید برای متغیر های global هم انجام بدم

تاثیر اینکار در پرفورمنس وحشتناک زیاده

fast concat string

۱۴۰۱ شهریور ۳۱, پنجشنبه ساعت ۹:۲۸

در حال کار کردن روی concat string هستم که بتونم performance اون رو بالا ببرم. برای اینکار باید strlen رو حذف کنم و مستقیم زمانی که دارم concat رو انجام میدم با realloc مجدد اندازه string رو ست کنم و اینکار رو انجام بدم.

امیدوارم نتیجه کار خوب از آب در بیاد.

بعد از بازگشت از یک سفر طولانی ( البته من دوست داشتم طولانی تر بشه که نشد ) باز هم به ادامه توسعه زبان برگشتم.

انجام base64

۱۴۰۱ شهریور ۲۱, دوشنبه ساعت ۱۰:۳۸

خب base64 رو هم encode و هم decode ش رو انجام دادم

البته هنوز plus equal رو اصلاح نکردم. اما به شکل زیر انجام شد. توابعی که لازم بود هم به string اضافه کردم تا کار انجام بشه.

function main() {
	let Base64 = {
	    characters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ,

	    encode: function( string )
	    {

	        let characters = this.characters;

	        let result = '';

	        let i = 0;
	        do {
	            let a = string.charCodeAt(i++);
	            let b = string.charCodeAt(i++);
	            let c = string.charCodeAt(i++);

	            
	            a = a ? a : 0;
	            b = b ? b : 0;
	            c = c ? c : 0;

	   
	            let b1 = ( a >> 2 ) & 0x3F;
	            let b2 = ( ( a & 0x3 ) << 4 ) | ( ( b >> 4 ) & 0xF );
	            let b3 = ( ( b & 0xF ) << 2 ) | ( ( c >> 6 ) & 0x3 );
	            let b4 = c & 0x3F;


	            if( ! b ) {
	                b3 = b4 = 64;
	            } else if( ! c ) {
	                b4 = 64;
	            }

	            result = result + this.characters.charAt( b1 ) + this.characters.charAt( b2 ) + this.characters.charAt( b3 ) + this.characters.charAt( b4 );


	        } while ( i < string.length );

	        return result;
	    } ,

	    decode: function( string )
	    {
	        let characters = this.characters;
	        let result     = '';

	        let i = 0;
	        do {
	      
	            let b1 = this.characters.indexOf( string.charAt(i++) );
	            let b2 = this.characters.indexOf( string.charAt(i++) );
	            let b3 = this.characters.indexOf( string.charAt(i++) );
	            let b4 = this.characters.indexOf( string.charAt(i++) );
	      
	            let a = ( ( b1 & 0x3F ) << 2 ) | ( ( b2 >> 4 ) & 0x3 );
	            let b = ( ( b2 & 0xF  ) << 4 ) | ( ( b3 >> 2 ) & 0xF );
	            let c = ( ( b3 & 0x3  ) << 6 ) | ( b4 & 0x3F );

	            result = result + (String.fromCharCode(a) + (b?String.fromCharCode(b):'') + (c?String.fromCharCode(c):'') );

	        } while( i < string.length );

	        return result;
	    }
	};

	let e = Base64.encode('test')
	print( e )
	print("\n")
	let d = Base64.decode(e)
	print( d )

}

یک base64 ساده با dolang

۱۴۰۱ شهریور ۲۱, دوشنبه ساعت ۷:۴۴

دارم یک base64 ساده با dolang مینویسم. با انجام اینکار هم خیلی از قسمت ها دیباگ میشه.

خیلی از باگ ها رو تا الان برطرف کردم.

چند مساوی پشت سر هم رو باید اضافه کنم

b3 = b4 = 64;

هگز رو باید اضافه کنم.

plus equal رو باید اصلاح کنم

با انجام اینکارها base64 تکمیل میشه.

بازگشت از سفر

۱۴۰۱ شهریور ۲۰, یکشنبه ساعت ۱۲:۲۲

خب بعد از برگشتن از سفر با خوردن دو تا فنجون قهوه و بالا بردن انرژی در حد نزدیکی های زحل ، در عرض ۱۰ دقیقه مشکل رو حل کردم. اینه که با سفر میشه ذهن رو خالی کرد.

سفر هم خیلی خوش گذشت. جالبترین قسمتش هم هم صحبتی با پیرزن و پیرمد های ابیانه بود. خیلی آدمهای عجیبی بودن. بدون لهجه صحبت میکردن. خیلی خون گرم بودن. همینطور بی خود و بی جهت باهات هم صحبت میشدن و باهات گرم میگرفتن. از هم صحبتی باهاشون لذت میبردی. توی ابیانه پیرزنی که حتی فکرشو نمیکردی سواد داشته باشه خیلی راحت کارتتو میگیره و رمزتو میپرسه و حساب میکنه. اونطرفتر هم یک پیرزن دیگه بنزین میفروشه. اون هم لیتری ۱۰ هزارتومن. اگر هم بنزنین نداشته باشه راهنماییت میکنه که کجا بری بنزین بگیری.

خوش گذشت.