Задать вопрос
  • Что будет быстрее работать?

    @nrgian
    dollar, вывод - О() нельзя брать в качестве отправной точки при сравнении столь разных способов доступа.
    Ну и в реальности, конечно, следует замерять, а не умозрительно сравнивать.

    Там много чего может быть: и кэширование DOM, и дополнительное индексирование для более быстрого доступа, и отсутствие/наличие JIT и пр. и пр.

    Ну и понятно, что чем глубже по иерархии вы пытаетесь по индексу проникнуть - тем более предпочтительнее по хэшу.
  • Что нужно знать и уметь джуниору PHP программисту для того чтобы устроится на работу(минимальный набор знаний)?

    @nrgian
    уметь джуниору PHP программисту для того чтобы устроится на работу(минимальный набор знаний)

    Это называется не джун, а трейни (trainee)
    А джуном он станет (начинающим) примерно через полгода после начала работы.
  • Что будет быстрее работать?

    @nrgian
    dollar,
    И что вас смущает?

    Да я вообще слишком уж поторопился, они далеко не эквивалетные.

    а) Индекс в массиве - это практически прямое смещение - одно умножение и одно сложение.
    б) А имея хэш вы так просто смещение не посчитаете. Там еще операций немало.

    Нотация O() говорит только об росте стоимости операции по мере роста данных.
    Но ничего не говорит о том, сколько стоит единичная операция

    Так вот - единичная операция извлечения по индексу в массиве - это ничтожно малое количество - 1 умножение, 1 сложение.

    Поиск по хэшу - это очень много операций.

    Исходник на языке, который копилируется в машинный код:
    package main
    
    import ("fmt")
    
    var adata []int
    var bdata map[int]int
    
    func aFunc(i int) int {
    		return adata[i]
    }
    
    func bFunc(i int) int {
                  	return bdata[i]
    }
    
    func main() {
    	bdata := make(map[int]int)
    
    	for i:= 0; i<10; i++ {
    		adata = append(adata, i)
    		bdata[i] = i
    	}
    	
    
    	fmt.Println(aFunc(5))
    	fmt.Println(bFunc(5))
    }


    Во что сгенерировалось для доступа по индексу массива:
    "".aFunc STEXT nosplit size=58 args=0x10 locals=0x8
    	0x0000 00000 (aaa.go:8)	TEXT	"".aFunc(SB), NOSPLIT|ABIInternal, $8-16
    	0x0000 00000 (aaa.go:8)	SUBQ	$8, SP
    	0x0004 00004 (aaa.go:8)	MOVQ	BP, (SP)
    	0x0008 00008 (aaa.go:8)	LEAQ	(SP), BP
    	0x000c 00012 (aaa.go:8)	FUNCDATA	$0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    	0x000c 00012 (aaa.go:8)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    	0x000c 00012 (aaa.go:8)	FUNCDATA	$3, gclocals·9fb7f0986f647f17cb53dda1484e0f7a(SB)
    	0x000c 00012 (aaa.go:9)	PCDATA	$2, $1
    	0x000c 00012 (aaa.go:9)	PCDATA	$0, $0
    	0x000c 00012 (aaa.go:9)	MOVQ	"".adata(SB), AX
    	0x0013 00019 (aaa.go:9)	MOVQ	"".i+16(SP), CX
    	0x0018 00024 (aaa.go:9)	CMPQ	"".adata+8(SB), CX
    	0x001f 00031 (aaa.go:9)	JLS	51
    	0x0021 00033 (aaa.go:9)	PCDATA	$2, $0
    	0x0021 00033 (aaa.go:9)	MOVQ	(AX)(CX*8), AX
    	0x0025 00037 (aaa.go:9)	MOVQ	AX, "".~r1+24(SP)
    	0x002a 00042 (aaa.go:9)	MOVQ	(SP), BP
    	0x002e 00046 (aaa.go:9)	ADDQ	$8, SP
    	0x0032 00050 (aaa.go:9)	RET
    	0x0033 00051 (aaa.go:9)	CALL	runtime.panicindex(SB)
    	0x0038 00056 (aaa.go:9)	UNDEF
    	0x0000 48 83 ec 08 48 89 2c 24 48 8d 2c 24 48 8b 05 00  H...H.,$H.,$H...
    	0x0010 00 00 00 48 8b 4c 24 10 48 39 0d 00 00 00 00 76  ...H.L$.H9.....v
    	0x0020 12 48 8b 04 c8 48 89 44 24 18 48 8b 2c 24 48 83  .H...H.D$.H.,$H.
    	0x0030 c4 08 c3 e8 00 00 00 00 0f 0b                    ..........
    	rel 15+4 t=15 "".adata+0
    	rel 27+4 t=15 "".adata+8
    	rel 52+4 t=8 runtime.panicindex+0


    А вот что сгенерировалось при доступе по хэшу:
    "".bFunc STEXT size=104 args=0x10 locals=0x28
    	0x0000 00000 (aaa.go:12)	TEXT	"".bFunc(SB), ABIInternal, $40-16
    	0x0000 00000 (aaa.go:12)	MOVQ	TLS, CX
    	0x0009 00009 (aaa.go:12)	MOVQ	(CX)(TLS*2), CX
    	0x0010 00016 (aaa.go:12)	CMPQ	SP, 16(CX)
    	0x0014 00020 (aaa.go:12)	JLS	97
    	0x0016 00022 (aaa.go:12)	SUBQ	$40, SP
    	0x001a 00026 (aaa.go:12)	MOVQ	BP, 32(SP)
    	0x001f 00031 (aaa.go:12)	LEAQ	32(SP), BP
    	0x0024 00036 (aaa.go:12)	FUNCDATA	$0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    	0x0024 00036 (aaa.go:12)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    	0x0024 00036 (aaa.go:12)	FUNCDATA	$3, gclocals·9fb7f0986f647f17cb53dda1484e0f7a(SB)
    	0x0024 00036 (aaa.go:13)	PCDATA	$2, $1
    	0x0024 00036 (aaa.go:13)	PCDATA	$0, $0
    	0x0024 00036 (aaa.go:13)	LEAQ	type.map[int]int(SB), AX
    	0x002b 00043 (aaa.go:13)	PCDATA	$2, $0
    	0x002b 00043 (aaa.go:13)	MOVQ	AX, (SP)
    	0x002f 00047 (aaa.go:13)	PCDATA	$2, $1
    	0x002f 00047 (aaa.go:13)	MOVQ	"".bdata(SB), AX
    	0x0036 00054 (aaa.go:13)	PCDATA	$2, $0
    	0x0036 00054 (aaa.go:13)	MOVQ	AX, 8(SP)
    	0x003b 00059 (aaa.go:13)	MOVQ	"".i+48(SP), AX
    	0x0040 00064 (aaa.go:13)	MOVQ	AX, 16(SP)
    	0x0045 00069 (aaa.go:13)	CALL	runtime.mapaccess1_fast64(SB)
    	0x004a 00074 (aaa.go:13)	PCDATA	$2, $1
    	0x004a 00074 (aaa.go:13)	MOVQ	24(SP), AX
    	0x004f 00079 (aaa.go:13)	PCDATA	$2, $0
    	0x004f 00079 (aaa.go:13)	MOVQ	(AX), AX
    	0x0052 00082 (aaa.go:13)	MOVQ	AX, "".~r1+56(SP)
    	0x0057 00087 (aaa.go:13)	MOVQ	32(SP), BP
    	0x005c 00092 (aaa.go:13)	ADDQ	$40, SP
    	0x0060 00096 (aaa.go:13)	RET
    	0x0061 00097 (aaa.go:13)	NOP
    	0x0061 00097 (aaa.go:12)	PCDATA	$0, $-1
    	0x0061 00097 (aaa.go:12)	PCDATA	$2, $-1
    	0x0061 00097 (aaa.go:12)	CALL	runtime.morestack_noctxt(SB)
    	0x0066 00102 (aaa.go:12)	JMP	0
    	0x0000 65 48 8b 0c 25 28 00 00 00 48 8b 89 00 00 00 00  eH..%(...H......
    	0x0010 48 3b 61 10 76 4b 48 83 ec 28 48 89 6c 24 20 48  H;a.vKH..(H.l$ H
    	0x0020 8d 6c 24 20 48 8d 05 00 00 00 00 48 89 04 24 48  .l$ H......H..$H
    	0x0030 8b 05 00 00 00 00 48 89 44 24 08 48 8b 44 24 30  ......H.D$.H.D$0
    	0x0040 48 89 44 24 10 e8 00 00 00 00 48 8b 44 24 18 48  H.D$......H.D$.H
    	0x0050 8b 00 48 89 44 24 38 48 8b 6c 24 20 48 83 c4 28  ..H.D$8H.l$ H..(
    	0x0060 c3 e8 00 00 00 00 eb 98                          ........
    	rel 12+4 t=16 TLS+0
    	rel 39+4 t=15 type.map[int]int+0
    	rel 50+4 t=15 "".bdata+0
    	rel 70+4 t=8 runtime.mapaccess1_fast64+0
    	rel 98+4 t=8 runtime.morestack_noctxt+0


    Обратите внимание - при обращении по индексу - все нужные операции вообще можно на месте сделать.
    При поиске через хэш - вызывается отдельная функция. Потому что вставлять каждый раз ее код в виде inline слишком накладно.

    Сама функция поиска по хэшу:
    func mapaccess1_fast64(t *maptype, h *hmap, key uint64) unsafe.Pointer {
    
    	if raceenabled && h != nil {
    
    		callerpc := getcallerpc()
    
    		racereadpc(unsafe.Pointer(h), callerpc, funcPC(mapaccess1_fast64))
    
    	}
    
    	if h == nil || h.count == 0 {
    
    		return unsafe.Pointer(&zeroVal[0])
    
    	}
    
    	if h.flags&hashWriting != 0 {
    
    		throw("concurrent map read and map write")
    
    	}
    
    	var b *bmap
    
    	if h.B == 0 {
    
    		// One-bucket table. No need to hash.
    
    		b = (*bmap)(h.buckets)
    
    	} else {
    
    		hash := t.key.alg.hash(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
    
    		m := bucketMask(h.B)
    
    		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
    
    		if c := h.oldbuckets; c != nil {
    
    			if !h.sameSizeGrow() {
    
    				// There used to be half as many buckets; mask down one more power of two.
    
    				m >>= 1
    
    			}
    
    			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
    
    			if !evacuated(oldb) {
    
    				b = oldb
    
    			}
    
    		}
    
    	}
    
    	for ; b != nil; b = b.overflow(t) {
    
    		for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 8) {
    
    			if *(*uint64)(k) == key && !isEmpty(b.tophash[i]) {
    
    				return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize))
    
    			}
    
    		}
    
    	}
    
    	return unsafe.Pointer(&zeroVal[0])
    
    }


    Функция - очень и очень немаленькая.
    Ну и сравните с несколькими ассемблерными инструкциями для доступа по индексу.
  • Что будет быстрее работать?

    @nrgian
    dollar,
    дело в том, что если хэш влазит в регистр, то он полностью эквивалентен индексу.
    ну то есть все те же операции что и по индексу + операции связанные с вычислением хеша.
    и по уму - еще и борьба с коллизиями.
  • Что будет быстрее работать?

    @nrgian
    dollar,
    пусть хеш будет 64 бита, чтобы в регистр поместиться без проблем, хотя это многовато.

    Многовато?
    А что там с коллизиями на такой длине?
  • Что будет быстрее работать?

    @nrgian
    dollar,
    Также а) считываем сам хеш б) считываем адрес массива. Небольшое вычисление - берем первые N бит хеша и превращаем в число, я даже это считать не буду за операцию.

    Эка как вы здорово посчитали!
    "Не буду считать", "считаем сам хеш".
    Какой длины хеш-то, сколько байт считали-то?
  • Что будет быстрее работать?

    @nrgian
    dollar,
    и что сложного "раскрутить" хеш? Это практически обращение по индексу.

    Никто не говорит, что это дико сложно.
    Я сказал, что это сложнее относительно работы с индексом.

    Просто посчитайте число операций:
    для индекса это 1 сложение, 1 умножение, 1 чтение данных. Правда - на каждом уровне. То есть чем больше уровней, тем медленнее.

    А теперь посчитайте число операций поиска по хэшу.
  • Почему ElectronJS такой прожорливый?

    @nrgian
    alex_devPY,

    Ну нянять я могу кого угодно.

    Если можете - наймите квалифицированного специалиста, он знает как лучше.
    Вопрос в том, какая технология лучше всего подойдет по эту задачу.

    Это не ваш вопрос, а вопрос того квалифицированного специалиста, что вы наймете
    Можно и на питоне заморочиться для десктопа)) а надо ли)

    Подходящих технологий уйма.
    Если вы в них не разбираетесь, то просто наймите квалифицированного специалиста.
  • Почему ElectronJS такой прожорливый?

    @nrgian
    alex_devPY,
    Согласен. Думал насчет альтернативы в виде С++

    Писать нужно на том, что ты лично (или нанятые тобою люди) знают лучше всего.
  • Как собрать как можно более лёгкое Android приложение?

    @nrgian
    ixon,
    как я понял Android go поддерживается только с Android 8.

    Не в этом дело.
    Под Android Go очень жесткие требования для разработчиков.
    И потому уже разработаны методы оптимизации на размер приложений.

    Но эти же самые методы можно применить и для обычного Android.
  • Что будет быстрее работать?

    @nrgian
    dollar,
    может искать по хешу, а это O(1)


    Это очень разные О(1)
    То ли дело прямая индексация, то ли еще хэш раскрутить надо.
  • Подойдет ли этот ноутбук для фронтенд разработчика?

    @nrgian
    Вазген Алексанян,
    да мне как раз и для мобильности, не знаю почему на вес интернет говорят что для мобильности 15.6 это много, вот у друга такой дюйм, и скажу вам очень даже удобно носит в рюкзаке.

    Никто не говорит, что его вообще нельзя носить. Но это дико неудобно.

    Практика показывает, что компромисс между размером-мобильностью и удобством работы лежит на 14 дюймах для обычного экрана и 13 для Retina
  • Как называются, и что обозначают L-образные скобки?

    @nrgian
    снимок экрана сделай и сюда нам картинку покажи что ты имеешь ввиду
  • Как различные платформы/сервисы (не банки) делают свои платежные сис-мы?

    @nrgian
    prrrrrrr,
    делать свою платёжную сис-му

    У всей деятельности в мире один и тот же смысл - деньги.
    Делают свою платежную систему, чтобы заработать.

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

    И будет окупаться постоянно - ибо ты будешь иметь свой заметный процент - с каждого платежа.
  • Правильно ли считается место на VPS?

    @nrgian
    mts2050, есть еще служебные данные.
    например, сами записи о том, где что хранится.
    Например, одна из простейших файловых систем:
    samag.ru/archive/article/245
    Современные - еще сложнее.
  • Два сайта на разных VPS или лучше на одном?

    @nrgian
    andreyyka,
    Вы в любом случае делите сервер с другими.

    Это что же такое нужно делать, какой же говнокод нужно написать - чтобы так просело, чтобы не хватало.
  • Какое направление будет более перспективно?

    @nrgian
    Вы слишком уж затачивайтесь на то, "а что будет если выберу неправильный язык".

    Выучить сложно только первый язык.
    На два моих крайних после 30 предыдущих - потрачено 3 дня (Go) и 1 неделя (Dart)
  • Как оптимизировать nginx на слабом сервере?

    @nrgian
    Energy2,
    см. upd

    Вангую - проблема не в nginx
    А в PHP или БД, к которой PHP обращается.
  • Как оптимизировать nginx на слабом сервере?

    @nrgian
    Это довольно сильный сервер для "просто nginx". Ну если только вы не петабайты видео (или т.п.) раздаете
    Видимо проблема в том, куда у вас уходит запрос после nginx. Но этого не видно - не приведено в конфигурации.