Marc Gravell

blog.marcgravell.com · Personal blog · on HN since 2014

Marc Gravell, a .NET developer known for work at Stack Overflow, writes about performance, .NET IO pipelines, and CUDA from C#.

What HN saysHN links it for his .NET Pipelines series, his CUDA rewrite of Stack Overflow's tag engine, and a post on GC pauses.
28HN people shared it
9linked it in comments
31stories submitted
442story points
5 years agolast shared
2014people per year2026

Most-shared posts

  1. 1
    .NET Core, .NET 5; the Exodus of .NET Framework?
    3 people · 60 points · first shared 2020 · 25 comments on HN
  2. 2
    Fun with the Spiral of Death
    3 people · 4 points · first shared 2019 · discussion on HN
  3. 3
    How i found cuda or rewriting tag
    3 people · first shared 2016
  4. 4
    Pipelines – a guided tour of the new IO API in .NET
    2 people · 286 points · first shared 2018 · 26 comments on HN
  5. 5
    How I Found CUDA, Or: Rewriting the Tag Engine
    2 people · 49 points · first shared 2016 · 14 comments on HN
  6. 6
    Is the era of reflection-heavy C# libraries at an end?
    2 people · 11 points · first shared 2021 · 1 comments on HN
  7. 7
  8. 8
    CUDA–getting started in .NET
    2 people · 4 points · first shared 2016 · 1 comments on HN
  9. 9
    The Road to DNX – Part 1
    2 people · 2 points · first shared 2015 · discussion on HN
  10. 10
    Is the era of reflection-heavy C# libraries at an end?
    1 people · 3 points · first shared 2021 · 1 comments on HN
  11. 11
    Having a serious conversation about open source
    1 people · 2 points · first shared 2018 · discussion on HN
  12. 12
    .NET Spans (Bounded and Type-Safe Pointers)
    1 people · 2 points · first shared 2017 · 1 comments on HN
  13. 13
    Prefer ValueTask to Task, always; and don't await twice
    1 people · 2 points · first shared 2019 · discussion on HN
  14. 14
    Securing Redis in the Cloud
    1 people · 2 points · first shared 2014 · discussion on HN
  15. 15

What HN people wrote when they linked it

j_s · 2016-06-29
The following blog series may provide additional insight into the process of applying CUDA to existing code: http://blog.marcgravell.com/2016/05/cudagetting-started-in-net.html
snak · 2020-09-10
Four, include Marc Gravell. https://blog.marcgravell.com/
moomin · 2017-06-19
It's important if you care about GC pauses (which you will eventually). Take a look at this report from the .NET based stack overflow guys: http://blog.marcgravell.com/2011/10/assault-by-gc.html?m=1 Note that they solved their problems using exactly the features being added in Java 9.
deanward81 · 2017-05-31
At the time the algorithm was running on one of the servers in the data centre and until recently we didn't have anything in the DC kitted out with GPUs (see http://blog.marcgravell.com/2016/05/how-i-found-cuda-or-rewriting-tag.… for the reason behind that). I'm not sure if we're planning to use GPUs for future iterations of algorithm testing; the GPUs are installed in hardware serving production traffic so it's unlikely to be used for experimental stuff like this. That said, a bunch of us just got Dell XPS-15s with the NVIDIA GTX 1050 so we can probably have a go on our local machines to get a feel for performance characteristics... watch this space, I guess!
Shog9 · 2017-01-17
The GPU use is perhaps the most interesting here... Marc Gravell wrote a series of articles about it: http://blog.marcgravell.com/2016/05/how-i-found-cuda-or-rewriting-tag.…
Groxx · 2018-10-05
Select is a bit less common (at least in use) from what I've seen, yea... until you start looking at Promises and Rx. Then it's absolutely everywhere, e.g. `Promise.race(futures...)` (which trivially handles a flexible length of futures, unlike select) or any merging operator in Rx. More often though I see code waiting on all rather than any, and Go doesn't seem to change that. Channels though are everywhere, and sample code tends to look almost exactly like introductory Go stuff[1] - Java has multiple BlockingQueues which serve the same purpose as a buffered channel, and SynchronousQueue is a non-buffered one. Though they don't generally include the concept of "close"... But streams do have the "close" concept in nearly all cases, and streams are all over the place in many many forms, and have been for a long time. They generally replace both select and channels, but are usually much easier to use IMO (e.g. `stream.map(i -> i.string())` vs two channels + for/range/don't forget to safely close it or you leak a goroutine). Some of that is due to generics though. [1]: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Blockin… --- some alternate stream concepts are super interesting too, e.g. .NET's new pipelines: https://blog.marcgravell.com/2018/07/pipe-dreams-part-1.html
paulstovell · 2016-03-02
We put an explanation here (hope it's OK to post the link): https://octopus.com/blog/build-your-binaries-once A real world example of this is that when .NET 4.5 shipped, the compilers in .NET 4.5 for 4.0 code produced different output than the .NET 4.0 compilers would have. So installing a system-level update on Windows on a build server would mean Test and Production got different results: http://blog.marcgravell.com/2012/09/iterator-blocks-missing-methods-an… Also, releases move through environments at different times: Monday: 1.0 goes to Test Tuesday: 1.1 goes to Test Wednesday: 1.0 goes to Prod Between 1.0 and 1.1, perhaps you updated Node, or went to Python3 - so your build server had to be updated. Reproducing Monday's build is going to be more difficult the more time that goes by. As you said, truly reproducible builds are hard. Why not just zip the artifacts and use the same files, instead of rebuilding?

Keyboard shortcuts

/Search
j kNext / previous blog
EnterOpen selected blog
vVisit the blog site
fFollow / unfollow
lSwitch grid / list view
dSwitch dark mode
g hHome
g pTop posts
g tTopics
g fFollowing
g lLiked
g yHistory
g qFAQ
EscBack / close