SlideShare a Scribd company logo
1 of 150
Download to read offline
Slice Recycling

Performance and Pitfalls
David Golden
@xdg • https://xdg.me/
Staff Engineer, MongoDB
Gotham Go 2019
Garbage!
Discarded memory
Go provides a
garbage collector
Does this really matter?
Call stack

(box per fcn)
Execution time
Call stack

(box per fcn)
Execution time
Left-to-right order is meaningless
Execution time
null
What’s going on?
What does this have to
do with slices?
⚠
Gross simplification
ahead…
GC runs when live heap
memory doubles
GC steals time
when it can’t keep up
Allocate less often!
sync.Pool
recycles objects
between GC cycles
But…
Not designed for slices
Not size aware!
Slice capacities in
the pool can differ
Pool order is undefined!
‘I have a
little
water’
‘I have a
little
water’
Oops!
Pool gave me a
giant container
‘I have a
lot of
water’
‘I have a
lot of
water’
Oops!
Pool gave me a
tiny container
Think about append…
xs = append(xs, ys…)
xs = append(xs, ys…)
Not always the same slice!
xs = append(xs, ys…)
xs = append(xs, ys…)
xs = append(xs, ys…)
This is thrown away!
X
What can we do?
Consider a trivial
encoder
Consider a trivial
encoder
?!
string keys
integer values
Packed binary format
42“foo0” 99“bar0”
Variable length!
Pluggable memory
management
type BytePool interface {
Get() []byte
Put([]byte)
Resize(orig []byte, n int) []byte
}
type BytePool interface {
Get() []byte
Put([]byte)
Resize(orig []byte, n int) []byte
}
type poolEncoder struct {
pool BytePool
buf []byte
}
Uses the pool
for allocations
Uses the pool for resizing
(not append)
Releases the buffer
to the pool
Four strategies…
1. ‘null’ – use the garbage collector
1. ‘null’ – use the garbage collector
2. ‘sync’ – use a sync.Pool
1. ‘null’ – use the garbage collector
2. ‘sync’ – use a sync.Pool
3. ‘power2’ – sync.Pool per size bucket
1. ‘null’ – use the garbage collector
2. ‘sync’ – use a sync.Pool
3. ‘power2’ – sync.Pool per size bucket
4. ‘reserved’ – keep N buffers around forever
1. null
Use the garbage collector
type nullPool struct{}
type NullPool struct{}
func (np NullPool) Get() []byte {
return make([]byte, 0, startCap)
}
type NullPool struct{}
func (np NullPool) Get() []byte {
return make([]byte, 0, startCap)
}
func (np NullPool) Put(bs []byte) {}
type NullPool struct{}
func (np NullPool) Get() []byte {
return make([]byte, 0, startCap)
}
func (np NullPool) Put(bs []byte) {}
func (np NullPool) Resize(orig []byte, size int) []byte {
}
type NullPool struct{}
func (np NullPool) Get() []byte {
return make([]byte, 0, startCap)
}
func (np NullPool) Put(bs []byte) {}
func (np NullPool) Resize(orig []byte, size int) []byte {
if size < cap(orig) {
return orig[0:size]
}
}
type NullPool struct{}
func (np NullPool) Get() []byte {
return make([]byte, 0, startCap)
}
func (np NullPool) Put(bs []byte) {}
func (np NullPool) Resize(orig []byte, size int) []byte {
if size < cap(orig) {
return orig[0:size]
}
temp := make([]byte, size, max(size, cap(orig)*2))
copy(temp, orig)
return temp
}
2. sync
Use a sync.pool
type SyncPool struct {
pool *sync.Pool
}
func (sp SyncPool) Get() []byte {
}
func (sp SyncPool) Get() []byte {
bp := sp.pool.Get() // returns interface{}
}
func (sp SyncPool) Get() []byte {
bp := sp.pool.Get() // returns interface{}
if bp == nil {
return make([]byte, 0, startCap)
}
}
func (sp SyncPool) Get() []byte {
bp := sp.pool.Get()
if bp == nil {
return make([]byte, 0, startCap)
}
buf := bp.([]byte)
for i := range buf {
buf[i] = 0
}
return buf[0:0]
}
func (sp SyncPool) Get() []byte {
bp := sp.pool.Get()
if bp == nil {
return make([]byte, 0, startCap)
}
buf := bp.([]byte)
for i := range buf {
buf[i] = 0
}
return buf[0:0]
}
Optimized away by compiler!
func (sp SyncPool) Get() []byte {
bp := sp.pool.Get()
if bp == nil {
return make([]byte, 0, startCap)
}
buf := bp.([]byte)
for i := range buf {
buf[i] = 0
}
return buf[0:0]
}
func (sp SyncPool) Put(bs []byte) {
sp.pool.Put(bs)
}
func (sp SyncPool) Resize(orig []byte, size int) []byte {
}
func (sp SyncPool) Resize(orig []byte, size int) []byte {
if size < cap(orig) {
return orig[0:size]
}
temp := make([]byte, size, max(size, cap(orig)*2))
copy(temp, orig)
sp.Put(orig)
return temp
}
3. power2
sync.pool

per size bucket
type Power2Pool struct {
pools []*sync.Pool
}
type Power2Pool struct {
pools []*sync.Pool
}
Skipping the details!
Pools organized by
power-of-2 capacities
Get() and Resize()
call size-aware getn()
Put() also size-aware
4. reserved
Keep big containers around
type ReservedPool struct {
sync.Mutex
pool [20][]byte
size int
targetCap int
}
type ReservedPool struct {
sync.Mutex
pool [20][]byte
size int
targetCap int
}
Skipping the details!
Capped LIFO stack
Resizing grows

target capacity
Put() drops slices
smaller than target
1. ‘null’ – use the garbage collector
2. ‘sync’ – use a sync.Pool
3. ‘power2’ – sync.Pool per size bucket
4. ‘reserved’ – keep N buffers around forever
Ways to analyze?
• Benchmarking
• Max heap analysis
• Profiling – flame graphs
• Trace browser
Workload
• N items to encode
• 20 goroutines encoding
• Up to 1000 keys per encoding
• Up to 200 characters per key
Isolation
• Pre-generate random data lists outside loops
• Turn on profiler after data generation
• Constant randSeed for repeatability
• Goroutines iterate data lists from random
starting points
• Profile/trace with standalone executable
xdg-go/zzz-slice-recycling
Benchmarking
go test -bench .
null 17354 ns/op
sync 5264 ns/op
power2 4333 ns/op
reserved 2945 ns/op
Maximum heap(?!)
GODEBUG=gctrace=1
Debug line per GC run
... 13->26->16 MB ...
... 17->41->27 MB ...
... 28->36->10 MB ...
... 14->32->20 MB ...
... 21->24->5 MB ...
... 8->22->17 MB ...
... 18->29->14 MB ...
... 16->25->12 MB ...
... 16->35->22 MB ...
... 23->47->26 MB ...
... 27->45->20 MB ...
... 13->26->16 MB ...
... 17->41->27 MB ...
... 28->36->10 MB ...
... 14->32->20 MB ...
... 21->24->5 MB ...
... 8->22->17 MB ...
... 18->29->14 MB ...
... 16->25->12 MB ...
... 16->35->22 MB ...
... 23->47->26 MB ...
... 27->45->20 MB ...
Max heap at GC end
null 17354 ns/op 141 MB
sync 5264 ns/op 35 MB
power2 4333 ns/op 9 MB
reserved 2945 ns/op 19 MB
Profiling
$ ./main -pooltype <type> -profile cpu
$ go tool pprof -http :8080 
./main ./cpu.pprof
null
sync
null
power2
null
reserved
null
Tracing
$ ./main -pooltype <type> -profile trace
$ go tool trace -http :8080 
./main ./trace.pprof
null
null
Type '?' for nav help
null
null
null
null
sync
power2
reserved
• Benchmarking
• Max heap analysis
• Profiling – flame graphs
• Trace browser
What about naive
approach?
func (sp LeakySyncPool) Resize(orig []byte, size int) []byte {
if size < cap(orig) {
return orig[0:size]
}
temp := make([]byte, size, max(size, cap(orig)*2))
copy(temp, bs)
sp.Put(bs)
return temp
}
null 17354 ns/op 141 MB
sync 5264 ns/op 35 MB
power2 4333 ns/op 9 MB
reserved 2945 ns/op 19 MB
leakysync 3183 ns/op 9 MB
What's going on?!?
Reserved!?
leaky → large containers
Larger starting capacity?
1000x
startCap 256 bytes 256,000 bytes
1000x
startCap 256 bytes 256,000 bytes
null 17354 ns/op
sync 5264 ns/op
power2 4333 ns/op
reserved 2945 ns/op
leakysync 3183 ns/op
1000x
startCap 256 bytes 256,000 bytes
null 17354 ns/op 13633 ns/op
sync 5264 ns/op 2839 ns/op
power2 4333 ns/op 2975 ns/op
reserved 2945 ns/op 2659 ns/op
leakysync 3183 ns/op 3082 ns/op
Take aways
Don’t optimize early!
Don’t get clever!
Trade space for speed
Resizing hurts!
Allocate for the 99%tile
Happy recycling!
Thank you!
@xdg david@mongodb.com https://xdg.me
https://github.com/xdg-go/zzz-slice-recycling

More Related Content

What's hot

Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...
Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...
Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...
slashn
 
Tupperware: Containerized Deployment at FB
Tupperware: Containerized Deployment at FBTupperware: Containerized Deployment at FB
Tupperware: Containerized Deployment at FB
Docker, Inc.
 
Concurrency Patterns with MongoDB
Concurrency Patterns with MongoDBConcurrency Patterns with MongoDB
Concurrency Patterns with MongoDB
Yann Cluchey
 

What's hot (20)

Distributed Transactions: Saga Patterns
Distributed Transactions: Saga PatternsDistributed Transactions: Saga Patterns
Distributed Transactions: Saga Patterns
 
Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...
Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...
Slash n: Tech Talk Track 2 – Distributed Transactions in SOA - Yogi Kulkarni,...
 
Deploy 22 microservices from scratch in 30 mins with GitOps
Deploy 22 microservices from scratch in 30 mins with GitOpsDeploy 22 microservices from scratch in 30 mins with GitOps
Deploy 22 microservices from scratch in 30 mins with GitOps
 
Tupperware: Containerized Deployment at FB
Tupperware: Containerized Deployment at FBTupperware: Containerized Deployment at FB
Tupperware: Containerized Deployment at FB
 
Concurrency Patterns with MongoDB
Concurrency Patterns with MongoDBConcurrency Patterns with MongoDB
Concurrency Patterns with MongoDB
 
GitHub Actions (Nakov at RuseConf, Sept 2022)
GitHub Actions (Nakov at RuseConf, Sept 2022)GitHub Actions (Nakov at RuseConf, Sept 2022)
GitHub Actions (Nakov at RuseConf, Sept 2022)
 
Schema Registry 101 with Bill Bejeck | Kafka Summit London 2022
Schema Registry 101 with Bill Bejeck | Kafka Summit London 2022Schema Registry 101 with Bill Bejeck | Kafka Summit London 2022
Schema Registry 101 with Bill Bejeck | Kafka Summit London 2022
 
Angular Libraries & NPM
 Angular Libraries & NPM Angular Libraries & NPM
Angular Libraries & NPM
 
NATS vs HTTP
NATS vs HTTPNATS vs HTTP
NATS vs HTTP
 
TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java Developers
 
Introduction to container based virtualization with docker
Introduction to container based virtualization with dockerIntroduction to container based virtualization with docker
Introduction to container based virtualization with docker
 
InnoDB Locking Explained with Stick Figures
InnoDB Locking Explained with Stick FiguresInnoDB Locking Explained with Stick Figures
InnoDB Locking Explained with Stick Figures
 
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
Cloud-Native CI/CD on Kubernetes with Tekton PipelinesCloud-Native CI/CD on Kubernetes with Tekton Pipelines
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
 
WebSocket MicroService vs. REST Microservice
WebSocket MicroService vs. REST MicroserviceWebSocket MicroService vs. REST Microservice
WebSocket MicroService vs. REST Microservice
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
DoK Talks #91- Leveraging Druid Operator to manage Apache Druid on Kubernetes
DoK Talks #91- Leveraging Druid Operator to manage Apache Druid on KubernetesDoK Talks #91- Leveraging Druid Operator to manage Apache Druid on Kubernetes
DoK Talks #91- Leveraging Druid Operator to manage Apache Druid on Kubernetes
 
Reactive programming with examples
Reactive programming with examplesReactive programming with examples
Reactive programming with examples
 
Introduction to Kafka Streams
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka Streams
 
Scalability Design Principles - Internal Session
Scalability Design Principles - Internal SessionScalability Design Principles - Internal Session
Scalability Design Principles - Internal Session
 
Introduction to Kubernetes
Introduction to KubernetesIntroduction to Kubernetes
Introduction to Kubernetes
 

Similar to Slice Recycling Performance and Pitfalls

Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14
Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14
Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14
Jayesh Thakrar
 
JavaSE7 Launch Event: Java7xGroovy
JavaSE7 Launch Event: Java7xGroovyJavaSE7 Launch Event: Java7xGroovy
JavaSE7 Launch Event: Java7xGroovy
Yasuharu Nakano
 
KCDC - .NET memory management
KCDC - .NET memory managementKCDC - .NET memory management
KCDC - .NET memory management
benemmett
 

Similar to Slice Recycling Performance and Pitfalls (20)

Developing High Performance Application with Aerospike & Go
Developing High Performance Application with Aerospike & GoDeveloping High Performance Application with Aerospike & Go
Developing High Performance Application with Aerospike & Go
 
"Metrics: Where and How", Vsevolod Polyakov
"Metrics: Where and How", Vsevolod Polyakov"Metrics: Where and How", Vsevolod Polyakov
"Metrics: Where and How", Vsevolod Polyakov
 
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
 
Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14
Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14
Chicago-Java-User-Group-Meetup-Some-Garbage-Talk-2015-01-14
 
Latinoware
LatinowareLatinoware
Latinoware
 
Metrics: where and how
Metrics: where and howMetrics: where and how
Metrics: where and how
 
Всеволод Поляков (DevOps Team Lead в Grammarly)
Всеволод Поляков (DevOps Team Lead в Grammarly)Всеволод Поляков (DevOps Team Lead в Grammarly)
Всеволод Поляков (DevOps Team Lead в Grammarly)
 
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your DataMongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
JavaSE7 Launch Event: Java7xGroovy
JavaSE7 Launch Event: Java7xGroovyJavaSE7 Launch Event: Java7xGroovy
JavaSE7 Launch Event: Java7xGroovy
 
KCDC - .NET memory management
KCDC - .NET memory managementKCDC - .NET memory management
KCDC - .NET memory management
 
MongoDB World 2019: RDBMS Versus MongoDB Aggregation Performance
MongoDB World 2019: RDBMS Versus MongoDB Aggregation PerformanceMongoDB World 2019: RDBMS Versus MongoDB Aggregation Performance
MongoDB World 2019: RDBMS Versus MongoDB Aggregation Performance
 
Improving go-git performance
Improving go-git performanceImproving go-git performance
Improving go-git performance
 
Heap Hand note
Heap Hand noteHeap Hand note
Heap Hand note
 
Data made out of functions
Data made out of functionsData made out of functions
Data made out of functions
 
zStore
zStorezStore
zStore
 
F(1)
F(1)F(1)
F(1)
 
Scala to assembly
Scala to assemblyScala to assembly
Scala to assembly
 
CSS parsing: performance tips & tricks
CSS parsing: performance tips & tricksCSS parsing: performance tips & tricks
CSS parsing: performance tips & tricks
 
Parallel Computing in R
Parallel Computing in RParallel Computing in R
Parallel Computing in R
 

More from David Golden

More from David Golden (17)

Free QA!
Free QA!Free QA!
Free QA!
 
Eversion 101: An Introduction to Inside-Out Objects
Eversion 101: An Introduction to Inside-Out ObjectsEversion 101: An Introduction to Inside-Out Objects
Eversion 101: An Introduction to Inside-Out Objects
 
Perl 5 Version 13
Perl 5 Version 13Perl 5 Version 13
Perl 5 Version 13
 
IsTrue(true)?
IsTrue(true)?IsTrue(true)?
IsTrue(true)?
 
One BSON to Rule Them
One BSON to Rule ThemOne BSON to Rule Them
One BSON to Rule Them
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in Optimization
 
Make Comments Stand Out
Make Comments Stand OutMake Comments Stand Out
Make Comments Stand Out
 
State of the Velociraptor Mini-Keynote: Perl Toolchain
State of the Velociraptor Mini-Keynote: Perl ToolchainState of the Velociraptor Mini-Keynote: Perl Toolchain
State of the Velociraptor Mini-Keynote: Perl Toolchain
 
Practical Consistency
Practical ConsistencyPractical Consistency
Practical Consistency
 
How I get to the ☞
How I get to the ☞How I get to the ☞
How I get to the ☞
 
Real World Optimization
Real World OptimizationReal World Optimization
Real World Optimization
 
Safer Chainsaw Juggling (Lightning Talk)
Safer Chainsaw Juggling (Lightning Talk)Safer Chainsaw Juggling (Lightning Talk)
Safer Chainsaw Juggling (Lightning Talk)
 
Taking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsTaking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order Functions
 
Juggling Chainsaws: Perl and MongoDB
Juggling Chainsaws: Perl and MongoDBJuggling Chainsaws: Perl and MongoDB
Juggling Chainsaws: Perl and MongoDB
 
Cooking Perl with Chef: Real World Tutorial with Jitterbug
Cooking Perl with Chef: Real World Tutorial with JitterbugCooking Perl with Chef: Real World Tutorial with Jitterbug
Cooking Perl with Chef: Real World Tutorial with Jitterbug
 
Cooking Perl with Chef: Hello World Tutorial
Cooking Perl with Chef: Hello World TutorialCooking Perl with Chef: Hello World Tutorial
Cooking Perl with Chef: Hello World Tutorial
 
Cooking Perl with Chef
Cooking Perl with ChefCooking Perl with Chef
Cooking Perl with Chef
 

Recently uploaded

%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 

Recently uploaded (20)

call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 

Slice Recycling Performance and Pitfalls