День 1-1 · Феликс Гайзендорфер

День 1-1 · Феликс Гайзендорфер


День 1-1 · Феликс Гайзендорфер

Опубликовано:

Настало время гиков, так что пришло время Адвента Кода 2021. Моей темой в прошлом году было изучение ржавчины, но в этом году я решил сосредоточиться на профилировании Go.

Идея состоит в том, чтобы закодировать простые решения и использовать инструменты профилирования Go для их оптимизации. Несколько человек в твиттере были заинтересованы в том, чтобы увидеть результаты в виде сообщений в блоге, поэтому я надеюсь написать несколько из них.

Весь код и профили вы можете найти в истории этого репозитория: github.com/felixge/advent-2021.

Отказ от ответственности: в настоящее время я работаю над непрерывным профилированием Go для Datadog, но я не лаю здесь от имени своего работодателя.

Задачу дня 1-1 решить довольно легко, поэтому я быстро нашел простое решение, см. ниже.

func Answer(input string) (int, error) {
	var prev struct {
		val int64
		set bool
	}
	var increases int
	for _, line := range strings.Split(input, "\n") {
		val, err := strconv.ParseInt(line, 10, 64)
		if err != nil {
			return 0, err
		}
		if val > prev.val && prev.set {
			increases++
		}
		prev.set = true
		prev.val = val
	}
	return increases, nil
}

Это работает, но достаточно ли это быстро? Давайте проведем тест.

$ go test -count 5 -run '^$' -bench . -cpuprofile=v1.cpu.pprof > v1.txt
$ benchstat v1.txt
name      time/op
Answer-6  325ns ± 1%

Хотя вам это может показаться не таким уж плохим, это определенно не Christmas Scale™️, поэтому давайте выясним, что мы можем оптимизировать, взглянув на профиль нашего процессора как на FlameGraph:

Похоже, 44% нашего времени мы проводим в strings.Split()давайте это оптимизируем.

Глядя на FrameGraph выше, обратите внимание, что strings.Split() звонки strings.IndexByte() который реализован на ассемблере. Оказывается, мы можем вызвать это напрямую, чтобы выполнить собственное разделение новой строки:

func Answer(input string) (int, error) {
	var prev struct {
		val int64
		set bool
	}
	var increases int
	var line string
	for len(input) > 0 {
		i := strings.IndexByte(input, '\n')
		if i == -1 {
			line = input
			input = ""
		} else {
			line = input(0:i)
			input = input(i+1:)
		}
		val, err := strconv.ParseInt(line, 10, 64)
		if err != nil {
			return 0, err
		}
		if val > prev.val && prev.set {
			increases++
		}
		prev.set = true
		prev.val = val
	}
	return increases, nil
}

Это немного сложнее, но давайте посмотрим, что это нам дает:

$ benchstat v1.txt v2.txt 
name      old time/op  new time/op  delta
Answer-6   325ns ± 1%   168ns ± 2%  -48.25%  (p=0.008 n=5+5)

Сокращение времени выполнения на 48 % — похоже, у нас хорошее начало! Что дальше?

Похоже на strconv.ParseInt() стал нашим новым узким местом.

Хотя эльфы не заявляют об этом явно, они дают нам только положительные целые числа. Таким образом, мы могли бы применить тот же трюк, что и раньше, и вызвать strconv.ParseUint() напрямую, а не через strconv.ParseInt().

Однако, глядя на реализацию ParseUint, становится ясно, что он делает кучу вещей для поддержки разных баз и размеров бит. Нам ничего из этого не нужно, поэтому давайте просто реализуем то подмножество, которое нам действительно нужно:

func parseInt(val string) (int64, error) {
	var intVal int64
	factor := int64(1)
	for i := len(val) - 1; i >= 0; i-- {
		c := val(i)
		if c >= '0' && c <= '9' {
			intVal += int64(c-'0') * factor
		} else {
			return intVal, fmt.Errorf("bad int: %q", val)
		}
		factor *= 10
	}
	return intVal, nil
}

Посмотрим, стоило ли оно того:

$ benchstat v2.txt v3.txt 
name      old time/op  new time/op  delta
Answer-6   168ns ± 2%    92ns ± 3%  -45.29%  (p=0.016 n=5+4)

Еще 45% — возможно, здесь мы, в конце концов, достигнем Christmas Scale™️.

Можем ли мы добиться еще большего?

Приведенный выше FlameGraph не дает нам никаких очевидных подсказок о том, что делать дальше. Но мы можем копнуть глубже. Например, давайте посмотрим, посмотрим View -> Source:

Как вы можете видеть, мы тратим довольно много времени на операцию подсрезов в режиме онлайн. 41. Это наша следующая подсказка?

v4: Ботаник-бекас

Эльфы сообщили мне, что текущее решение более чем в 3 раза быстрее, чем версия 1, что на данный момент достаточно хорошо:

$ benchstat v1.txt v3.txt 
name      old time/op  new time/op  delta
Answer-6   325ns ± 1%    92ns ± 3%  -71.68%  (p=0.016 n=5+4)

Однако они готовы предложить специальное предложение. Перейти к профилированию звезды всем, кому удастся улучшить версию v3. Здесь вы можете войти. Просто пришлите мне ссылку на ваше решение v4 в эта ветка в твиттере включая твой benchstats v3.txt v4.txt вывод, и я дам ссылку на него отсюда.

  1. Валентин Делеплас‘s решение с -87% дельта против v3
  2. Гарет Левин‘s решение с -83% дельта против v3
  3. Понтус Лейтцлер‘s решение с -74% дельта против v3
  4. @Фугиман‘s решение с -50% дельта против v3

Примечание: Приведенные выше результаты по разнице производительности получены самостоятельно. В моем собственном тестировании решение Валентина показало впечатляющие результаты. 14 ns/op и имеет -52% дельта против решения Гарета.

Вот и все на сегодня. Я определенно найду время только для нескольких из этих постов, но постараюсь, чтобы они появлялись.

— Феликс Гейзендорфер


Подпишитесь на этот блог через RSS или по электронной почте или получайте от меня небольшие обновления через Твиттер.





Source link

Postagens Similares

  • 文本即思想,思想是神聖的

    Anthropic 的 Thariq Shihipar 最近發表了一篇發人深省的文章,他認為對於大多數人工智慧用例,我們從 Markdown 轉向 HTML。 我理解他的觀點並在某種程度上同意,但我不同意所提出的解決方案。 以下是我對他的論點的理解: 我完全明白為什麼他喜歡這些可作為簡報的可共享 HTML 檔案。 Markdown 很難閱讀和分享長文檔 純文字無法像格式、圖像和視覺層次結構那樣傳達思想 因此,我們應該將主要規範格式從 Markdown 轉移到 HTML。 他指出 Markdown 更難以分享和交流想法,因為格式和視覺效果可以讓事情變得非常容易理解。 我對這種方法的問題是,透過以可編輯性換取可讀性,我們將人類與創作過程進一步分開。 我重視 Markdown 因為我重視文本。我重視文本,因為我認為它是遠離思想的一步。 我相信思考是我們應該小心不要外包的一件事,而且我擔心這個想法偷偷帶入的東西是朝著使我們的創造對人類不透明邁出的重要一步。不僅是人工智慧的創造,也是我們的創造。 我之所以如此重視保羅·格雷厄姆,是因為在寫出超級乾淨的散文時需要進行思想壓縮工作。寫清楚很難,因為它需要清晰的思考。 文字讓你的想法赤裸裸,我喜歡這一點。 到底是什麼問題? 我們該怎麼做才能解決呢? 為什麼我們的解決方案比其他解決方案更好? 我喜歡在涉及任何技術之前將此類關鍵內容具體化為純文字的挑戰。 如果我們不是自己編寫文本,然後對其進行編輯,那麼感覺就像將一個強大的機器人帶到健身房一樣。 我擔心,如果我們對人工智慧產生共鳴並讓它吐出令人驚嘆的 HTML,我們會立即與這個想法脫節。例如這個想法到哪裡去了?它一開始只是共鳴,然後透過木材削片機變成了別人的 HTML。 我可以用 4 個簡單的項目符號來了解它嗎?我可以盯著它看嗎?我能對付它嗎?我可以調整一下嗎?這是一個想法。我需要與它聯繫。 當然,我們可以要求人工智慧將其出色的 HTML 文件總結為四個項目符號,但透過壓縮和擴展,我們會損失原始文件的一定比例。 也許我在這裡過於情緒化了。 我只是覺得,如果你沒有將艱苦的思考和寫作工作融入到最初的想法中,然後以人類易於閱讀和編輯的格式維護它,那麼你就以某種方式將一些神聖的東西交給了機器。我是作為一個徹底的人工智慧最大化主義者這麼說的。 但我明白他的觀點,而且我認為這是非常正確的。 使用巨大的文本文件很難解釋或說服人們相信事情。格式化有很大幫助。圖片有很大幫助。甚至是一個介面或一個影片什麼的。 所以我們在這方面是同步的。我只是認為以不同的方式得到結果可能會更好。 降價:人類書寫容易,人類閱讀困難。 超文本標記語言:對人類來說很難書寫,對人類來說很容易閱讀。 也許解決方案並不是將第一步轉移到 HTML,因為 HTML 對代理程式和人類來說都變得更加不透明(加上…

  • お気に入り 5: バイ アダルト M/F ロマンス、パート II

    これらは、カップルの半分がバイである男女のロマンスです。パート I (および bi4bi の投稿へのリンク) については、ここをクリックしてください。アリシア・トンプソン著「一度も出荷されていない」ハンナ・ボナム=ヤング著「ピープル・ウォッチング」ジェシカ・ジェームス著「一夜限りのアンロマンス」エリン・コナー著「ベスト・ヘックス・エバー」ナディア・エル・ファッシ著 Source link

  • అగి గురించి ద్వార్కేష్ ఎందుకు తప్పు

    ద్వార్కేష్ పటేల్ ప్రస్తుతం నా అభిమాన ఆలోచనాపరులలో ఒకరు. నేను అతని ఉత్సుకత యొక్క తీవ్రతను ప్రేమిస్తున్నాను. అతని ఆసక్తులు ఎంత విస్తృతంగా ఉన్నాయో నాకు చాలా ఇష్టం. అతను యువ టైలర్ కోవెన్ లాగా ఉన్నాడు, మరియు అతను ఉంచిన ప్రతిదాన్ని నేను చూస్తాను. కానీ ఇటీవల అతను మీడియా చక్రంలో ఉన్నాడు, రాబోయే 1-3 సంవత్సరాల్లో అగి రాబోతున్నట్లు అతను ఎందుకు అనుకోడు అనే దాని గురించి మాట్లాడుతున్నాడు, మరియు అతను దాని గురించి…

  • Openai надеется взять 10% акций AMD через AI Chip Deal

    Openai и Усовершенствованные микро -устройства достигли сделки, которая могла бы увидеть, как компания Сэма Альтмана забрала 10% доли в чипов. Акции AMD взлетели на 23,71% в понедельник после новостей. OpenAI будет развернуть 6 гигаватт инстинктивных графических единиц AMD в течение нескольких лет и в течение нескольких поколений оборудования, сообщили компании в понедельник. Это начнется с…

  • SwiftUI మాత్రమే చెడు యాప్‌లను డెవలప్ చేయడాన్ని సులభతరం చేస్తుంది

    ఆదివారం, 7 జూన్ 2026 పాలో ఆండ్రేడ్, గత నెలలో, “2026లో Mac-Assed యాప్‌ని రూపొందించడానికి SwiftUIని ఉపయోగించడం”: నేను ఇటీవలే Shopie యొక్క macOS వెర్షన్‌ను ప్రారంభించాను, ఈ యాప్‌ను నేను గత సంవత్సరం చివర్లో iOS యాప్ స్టోర్‌లో మొదటిసారి విడుదల చేసాను. మీరు కోరికల జాబితాలను సృష్టించడానికి మరియు ఉత్పత్తి ధర, లభ్యత మరియు ఇతర వివరాలు మారినప్పుడు మీకు తెలియజేయడం ద్వారా మీకు ఆసక్తి ఉన్న ఉత్పత్తులను ట్రాక్ చేయడంలో Shopie…

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *