Optimizing Sequences Traversal and Extensibility

Miguel Gamboa
Miguel GamboaLecturer at ISEL
Optimizing Sequences
Traversal and Extensibility
Autor: Diogo Poeira
Orientador: Doutor Fernando Miguel Gamboa de Carvalho
1
2
3
Map Filter
Pipeline
Animações de Tagir Valeev da JetBrains
4
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
5
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Alternativas Third-Party
Cister.ValueLinq, LinqFaster, LinqAF, StructLinq, Hyperlinq, …
Guava, Protonpack, Vavr, Eclipse Collections, jOOλ, StreamEx, …
IxJs, Lazy.js, Lodash, Sequency, Underscore, …
Alternativas Third-Party
Cister.ValueLinq, LinqFaster, LinqAF, StructLinq, Hyperlinq, …
Guava, Protonpack, Vavr, Eclipse Collections, jOOλ, StreamEx, …
IxJs, Lazy.js, Lodash, Sequency, Underscore, …
6
Porquê tantas bibliotecas?
Quais as diferenças entre elas?
Qual escolher?
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
7
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
8
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
9
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
10
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
11
Tinyield
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
12
Tinyield
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
13
Tinyield
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
14
Tinyield
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
15
Tinyield
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
16
Tinyield
• Traduções complexas
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
17
Tinyield
• Traduções complexas
• Gerar máquinas de estado complexas
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
18
Tinyield
• Traduções complexas
• Gerar máquinas de estado complexas
• Perca de desempenho
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
19
Tinyield
• Traduções complexas
• Gerar máquinas de estado complexas
• Perca de desempenho
Flow Push/Pull
Pull
Push
Pull
Eager/Lazy
Lazy
Lazy
Eager
Linguagem Módulo Standard
.Net System.Linq
Java java.util.stream.Stream
Javascript Array
Extensibilidade
yield
Classe
Protótipo
Transparente
Não
Não
Sim
Quais as características do yield?
20
Quais as características do yield?
21
Quais as características do yield?
22
Terminologia
• Função geradora “function*”
Quais as características do yield?
23
Terminologia
• Função geradora “function*”
• Gerador
Quais as características do yield?
24
Terminologia
• Função geradora “function*”
• Gerador
• yield
Quais as características do yield?
25
Terminologia
• Função geradora “function*”
• Gerador
• yield
• Output
Propriedades
26
Propriedades
27
• Delimitado
Propriedades
28
• Delimitado
• Estaticamente tipificado
Propriedades
29
• Delimitado
• Estaticamente tipificado
• Objetos/Funções de primeira classe
Propriedades
30
• Delimitado
• Estaticamente tipificado
• Objetos/Funções de primeira classe
• Stackful
Stackful
31
Map – Hash Table
Stackful
32
Stackful
33
flatten(…)
Proposta Tinyield
34
Proposta Tinyield
35
Yield
Proposta Tinyield
36
Traverser
Proposta Tinyield
37
Advancer
Proposta Tinyield
38
Advancer
Proposta Tinyield
39
Advancer
Proposta Tinyield
40
Query
Proposta Tinyield
41
Query
• Collection Pipeline
Proposta Tinyield
42
Query
• Collection Pipeline
• Conjunto de operações completo
Proposta Tinyield
43
Query
• Collection Pipeline
• Conjunto de operações completo
• Extensibilidade
• Protocolo de iteração com melhor desempenho.
Proposta Tinyield
44
Query – Short-Circuit
Proposta Tinyield
45
Query – Short-Circuit
Proposta Tinyield
46
Query – Short-Circuit
Proposta Tinyield
47
Query - Extensibilidade
Proposta Tinyield
48
Query - Extensibilidade
Proposta Tinyield
49
Query - Extensibilidade
Tinyield - Stackful
50
yield Tinyield
Tinyield - Stackful
51
yield Tinyield
Tinyield - Stackful
52
yield Tinyield
Tinyield - Stackful
53
yield Tinyield
Benchmarks e Análise de performance
54
Benchmarks e Análise de performance
55
• Falta de benchmarks
Benchmarks e Análise de performance
56
• Falta de benchmarks
• Kotlin Benchmarks
Benchmarks e Análise de performance
57
• Falta de benchmarks
• Kotlin Benchmarks
• Desenho e Implementação de Benchmarks
Benchmarks e Análise de performance
58
• Falta de benchmarks
• Kotlin Benchmarks
• Desenho e Implementação de Benchmarks
• StackOverflow
Benchmarks e Análise de performance
59
• Falta de benchmarks
• Kotlin Benchmarks
• Desenho e Implementação de
Benchmarks
• StackOverflow
Benchmarks e Análise de performance
Every - Resultados
60
Benchmarks e Análise de performance
Find - Resultados
61
Benchmarks e Análise de performance
Find - Resultados
62
Benchmarks e Análise de performance
Benchmarks com dados reais
63
Benchmarks e Análise de performance
• REST Countries e Last.fm:
• “Distinct Top Artist and Top Track by Country”
• “Artists who are in a Country’s top ten who also have Tracks in the same
Country’s top ten”
Benchmarks com dados reais
64
Benchmarks e Análise de performance
• REST Countries e Last.fm:
• “Distinct Top Artist and Top Track by Country”
• “Artists who are in a Country’s top ten who also have Tracks in the same
Country’s top ten”
• World Weather Online:
• “Query Max Temperature”
• “Query Temperature Transitions”
• “Query Distinct Temperatures”
• Pipeline:
Benchmarks com dados reais
65
Benchmarks e Análise de performance
Query Distinct Temperatures - Resultados
66
Benchmarks e Análise de performance
Same Fringe
67
*
a *
b c
*
* c
a b
Tree A Tree B
Pipeline:
Benchmarks e Análise de performance
Same Fringe
68
*
a *
b c
*
* c
a b
Tree A Tree B
Pipeline:
Benchmarks e Análise de performance
Same Fringe - Resultados
69
Java Javascript .Net
Conclusões
• Compacto
• Eficiente
• Transparente
70
Validação
• Repositórios Github
71
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
72
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
• Benchmarks: Java, Javascript e .Net
73
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
• Benchmarks: Java, Javascript e .Net
• Benchmarks Parallel Streams
74
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
• Benchmarks: Java, Javascript e .Net
• Benchmarks Parallel Streams
• Sek: Wrapper ao Sequence do Kotlin para Java
75
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
• Benchmarks: Java, Javascript e .Net
• Benchmarks Parallel Streams
• Sek: Wrapper ao Sequence do Kotlin para Java
• Publicação na DZone – “Bridge the Gap of Zip Operation”
76
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
• Benchmarks: Java, Javascript e .Net
• Benchmarks Parallel Streams
• Sek: Wrapper ao Sequence do Kotlin para Java
• Publicação na DZone – “Bridge the Gap of Zip Operation”
• Publicação na InfoQ – “Enhanced Streams Processing with Kotlin’s Sequence
Interface”
77
Validação
• Repositórios Github
• Solução Tinyield: Jayield, tinyield4ts e tinyield4net
• Benchmarks: Java, Javascript e .Net
• Benchmarks Parallel Streams
• Sek: Wrapper ao Sequence do Kotlin para Java
• Publicação na DZone – “Bridge the Gap of Zip Operation”
• Publicação na InfoQ – “Enhanced Streams Processing with Kotlin’s Sequence
Interface”
• Paper na 16ª ICSOFT – “Deconstructing yield operator to enhance streams
processing”
78
Trabalho Futuro
• Geração do Advancer
79
Trabalho Futuro
• Geração do Advancer
• Eficácia das “Parallel Streams”
80
Trabalho Futuro
• Geração do Advancer
• Eficácia das “Parallel Streams”
• Aprofundar este estudo
81
82
1 of 82

Recommended

ProViNet : Uma Plataforma para Gerenciamento de Redes Virtuais Programáveis by
ProViNet : Uma Plataforma para Gerenciamento de Redes Virtuais ProgramáveisProViNet : Uma Plataforma para Gerenciamento de Redes Virtuais Programáveis
ProViNet : Uma Plataforma para Gerenciamento de Redes Virtuais ProgramáveisWanderson Paim
559 views51 slides
Experimentation of the Model Driven RichUbi Process in the Adaptive Rich Inte... by
Experimentation of the Model Driven RichUbi Process in the Adaptive Rich Inte...Experimentation of the Model Driven RichUbi Process in the Adaptive Rich Inte...
Experimentation of the Model Driven RichUbi Process in the Adaptive Rich Inte...Luciana Zaina
619 views30 slides
Inspeção de Código Clipper - Case de um projeto ágil by
Inspeção de Código Clipper - Case de um projeto ágilInspeção de Código Clipper - Case de um projeto ágil
Inspeção de Código Clipper - Case de um projeto ágilAgile_Clinic
433 views27 slides
Khomp testes complexos! by
Khomp   testes complexos!Khomp   testes complexos!
Khomp testes complexos!Bárbara Cabral da Conceição, CTFL
273 views45 slides
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015 by
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015André Curvello
3K views41 slides
TDC2016SP - Trilha Banco de Dados by
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dadostdc-globalcode
290 views46 slides

More Related Content

Similar to Optimizing Sequences Traversal and Extensibility

Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas... by
Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas...Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas...
Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas...Orlando Junior
1.1K views24 slides
InfluxDb: como monitorar milhares de dados por segundo em real time by
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time Umbler
5.2K views46 slides
Tdc2016 trilha-banco-influx.ppt by
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptMarcos Artigas
115 views46 slides
Bibliotecas de interface rica no jsf 2 by
Bibliotecas de interface rica no jsf 2Bibliotecas de interface rica no jsf 2
Bibliotecas de interface rica no jsf 2Pablo Nóbrega
9.4K views52 slides
TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ... by
TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ...TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ...tdc-globalcode
46 views20 slides
Testando aplicações PWA com Lighthouse - TDC 2017 | São Paulo by
Testando aplicações PWA com Lighthouse - TDC 2017 | São PauloTestando aplicações PWA com Lighthouse - TDC 2017 | São Paulo
Testando aplicações PWA com Lighthouse - TDC 2017 | São PauloJefferson Martins de Andrade
200 views20 slides

Similar to Optimizing Sequences Traversal and Extensibility(20)

Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas... by Orlando Junior
Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas...Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas...
Aprendizado de Máquina Supervisionado na Predição de Links em Redes Complexas...
Orlando Junior1.1K views
InfluxDb: como monitorar milhares de dados por segundo em real time by Umbler
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time
Umbler5.2K views
Tdc2016 trilha-banco-influx.ppt by Marcos Artigas
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.ppt
Marcos Artigas115 views
Bibliotecas de interface rica no jsf 2 by Pablo Nóbrega
Bibliotecas de interface rica no jsf 2Bibliotecas de interface rica no jsf 2
Bibliotecas de interface rica no jsf 2
Pablo Nóbrega9.4K views
TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ... by tdc-globalcode
TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ...TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha DevTest How we figured out we had a SRE team at ...
tdc-globalcode46 views
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC by Stefan Teixeira
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
Stefan Teixeira610 views
TDC2016SP - Trilha Banco de Dados by tdc-globalcode
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dados
tdc-globalcode261 views
MSc Thesis Defense - Mini-CCNx for Content-Centric Networking by Carlos Cabral
MSc Thesis Defense - Mini-CCNx for Content-Centric NetworkingMSc Thesis Defense - Mini-CCNx for Content-Centric Networking
MSc Thesis Defense - Mini-CCNx for Content-Centric Networking
Carlos Cabral857 views
Workshop III - A curadoria de repositórios e a disseminação em portais de pes... by Projeto RCAAP
Workshop III - A curadoria de repositórios e a disseminação em portais de pes...Workshop III - A curadoria de repositórios e a disseminação em portais de pes...
Workshop III - A curadoria de repositórios e a disseminação em portais de pes...
Projeto RCAAP193 views
Uma Arquitetura para Provisionamento de Ambientes de Alto Desempenho Customiz... by Miguel Xavier
Uma Arquitetura para Provisionamento de Ambientes de Alto Desempenho Customiz...Uma Arquitetura para Provisionamento de Ambientes de Alto Desempenho Customiz...
Uma Arquitetura para Provisionamento de Ambientes de Alto Desempenho Customiz...
Miguel Xavier478 views
Android: testes automatizados e TDD by Dextra
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
Dextra2.7K views
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1 by Giovanni Bassi
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Giovanni Bassi876 views
Do monolito aos microserviços com Docker (PHPSP+IMA) by Wellington Silva
Do monolito aos microserviços com Docker (PHPSP+IMA)Do monolito aos microserviços com Docker (PHPSP+IMA)
Do monolito aos microserviços com Docker (PHPSP+IMA)
Wellington Silva218 views

Recently uploaded

ATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdf by
ATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdfATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdf
ATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdfxapak38238
29 views2 slides
AE03 - CIRCUITOS ELETRICOS UNICESUMAR 54/2023 by
AE03 - CIRCUITOS ELETRICOS UNICESUMAR 54/2023AE03 - CIRCUITOS ELETRICOS UNICESUMAR 54/2023
AE03 - CIRCUITOS ELETRICOS UNICESUMAR 54/2023AssessoriaAcademica9
12 views4 slides
UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale... by
UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale...UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale...
UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale...vihoj47492
5 views4 slides
A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for... by
A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for...A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for...
A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for...PrimeEducacional
33 views2 slides
O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra... by
O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra...O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra...
O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra...vihoj47492
13 views1 slide
Boletim Informativo Novembro 2023.pdf by
Boletim Informativo Novembro 2023.pdfBoletim Informativo Novembro 2023.pdf
Boletim Informativo Novembro 2023.pdfFerreira Lapa
22 views2 slides

Recently uploaded(20)

ATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdf by xapak38238
ATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdfATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdf
ATIVIDADE 3 - AUTOMAÇÃO INDUSTRIAL - 542023.pdf
xapak3823829 views
UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale... by vihoj47492
UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale...UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale...
UNID 6 – Associação de impedâncias 1 – Calcule o valor da impedância equivale...
vihoj474925 views
A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for... by PrimeEducacional
A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for...A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for...
A Ciência Contábil desempenha um papel fundamental no mundo dos negócios, for...
PrimeEducacional33 views
O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra... by vihoj47492
O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra...O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra...
O diagrama trajeto passo, também conhecido como diagrama sequencial ou diagra...
vihoj4749213 views
Boletim Informativo Novembro 2023.pdf by Ferreira Lapa
Boletim Informativo Novembro 2023.pdfBoletim Informativo Novembro 2023.pdf
Boletim Informativo Novembro 2023.pdf
Ferreira Lapa22 views
ATIVIDADE 3 - ESTRUTURAS DE CONCRETO I - 542023.pdf by soyelax352
ATIVIDADE 3 - ESTRUTURAS DE CONCRETO I - 542023.pdfATIVIDADE 3 - ESTRUTURAS DE CONCRETO I - 542023.pdf
ATIVIDADE 3 - ESTRUTURAS DE CONCRETO I - 542023.pdf
soyelax3525 views
Na indústria, os transformadores são usados para alimentar máquinas e equipam... by Prime Assessoria
Na indústria, os transformadores são usados para alimentar máquinas e equipam...Na indústria, os transformadores são usados para alimentar máquinas e equipam...
Na indústria, os transformadores são usados para alimentar máquinas e equipam...
ATIVIDADE 1 - CIÊNCIAS POLÍTICAS 542023 .pdf by soyelax352
ATIVIDADE 1 - CIÊNCIAS POLÍTICAS 542023 .pdfATIVIDADE 1 - CIÊNCIAS POLÍTICAS 542023 .pdf
ATIVIDADE 1 - CIÊNCIAS POLÍTICAS 542023 .pdf
soyelax3525 views
ATIVIDADE 3 - CIRCUITOS ELÉTRICOS - 542023.pdf by xapak38238
ATIVIDADE 3 - CIRCUITOS ELÉTRICOS - 542023.pdfATIVIDADE 3 - CIRCUITOS ELÉTRICOS - 542023.pdf
ATIVIDADE 3 - CIRCUITOS ELÉTRICOS - 542023.pdf
xapak3823811 views
A European Society of Parenteral and Enteral Nutrition (ESPEN) recomenda que ... by assedlmoi
A European Society of Parenteral and Enteral Nutrition (ESPEN) recomenda que ...A European Society of Parenteral and Enteral Nutrition (ESPEN) recomenda que ...
A European Society of Parenteral and Enteral Nutrition (ESPEN) recomenda que ...
assedlmoi25 views
MAPA - PED - METODOLOGIA DO ENSINO DE GEOGRAFIA - 54 2023. by IntegrareAcademy2
MAPA - PED - METODOLOGIA DO ENSINO DE GEOGRAFIA - 54 2023.MAPA - PED - METODOLOGIA DO ENSINO DE GEOGRAFIA - 54 2023.
MAPA - PED - METODOLOGIA DO ENSINO DE GEOGRAFIA - 54 2023.
2) Segundo, você deverá inserir imagens e explicar sobre dois exemplos de dow... by PrimeEducacional
2) Segundo, você deverá inserir imagens e explicar sobre dois exemplos de dow...2) Segundo, você deverá inserir imagens e explicar sobre dois exemplos de dow...
2) Segundo, você deverá inserir imagens e explicar sobre dois exemplos de dow...
PrimeEducacional20 views
MAPA - CONTABILIDADE EMPRESARIAL - 54/2023 by AcademiaDL
MAPA - CONTABILIDADE EMPRESARIAL - 54/2023MAPA - CONTABILIDADE EMPRESARIAL - 54/2023
MAPA - CONTABILIDADE EMPRESARIAL - 54/2023
AcademiaDL9 views
Questão 1 LISTE e EXPLIQUE as sete perdas na construção civil. Questão 2 ARGU... by vihoj47492
Questão 1 LISTE e EXPLIQUE as sete perdas na construção civil. Questão 2 ARGU...Questão 1 LISTE e EXPLIQUE as sete perdas na construção civil. Questão 2 ARGU...
Questão 1 LISTE e EXPLIQUE as sete perdas na construção civil. Questão 2 ARGU...
vihoj474926 views
ATIVIDADE 3 - AGRON - DESENHO TECNICO E CONSTRUÇÕES RURAIS - 542023.pdf by loporo7100
ATIVIDADE 3 - AGRON - DESENHO TECNICO E CONSTRUÇÕES RURAIS - 542023.pdfATIVIDADE 3 - AGRON - DESENHO TECNICO E CONSTRUÇÕES RURAIS - 542023.pdf
ATIVIDADE 3 - AGRON - DESENHO TECNICO E CONSTRUÇÕES RURAIS - 542023.pdf
loporo710013 views
ATIVIDADE 1 - GESTÃO DE ALIMENTOS E BEBIDAS.docx by loporo7100
ATIVIDADE 1 - GESTÃO DE ALIMENTOS E BEBIDAS.docxATIVIDADE 1 - GESTÃO DE ALIMENTOS E BEBIDAS.docx
ATIVIDADE 1 - GESTÃO DE ALIMENTOS E BEBIDAS.docx
loporo71005 views
ATIVIDADE 1 - DESIGN EDUCACIONAL E INOVAÇÕES 542023 .pdf by xapak38238
ATIVIDADE 1 - DESIGN EDUCACIONAL E INOVAÇÕES 542023 .pdfATIVIDADE 1 - DESIGN EDUCACIONAL E INOVAÇÕES 542023 .pdf
ATIVIDADE 1 - DESIGN EDUCACIONAL E INOVAÇÕES 542023 .pdf
xapak382385 views
ATIVIDADE 3 - CIENCIAS DO AMBIENTE - 542023.pdf by loporo7100
ATIVIDADE 3 - CIENCIAS DO AMBIENTE - 542023.pdfATIVIDADE 3 - CIENCIAS DO AMBIENTE - 542023.pdf
ATIVIDADE 3 - CIENCIAS DO AMBIENTE - 542023.pdf
loporo71007 views

Optimizing Sequences Traversal and Extensibility

Editor's Notes

  1. Boa tarde a todos, espero que se encontrem bem. Eu sou o Diogo e venho-vos apresentar a minha Tese: “Optimizing sequences traversal and extensibility”.
  2. Todas as linguagens de programação incluem um modulo standard para processamento de sequencias de dados.
  3. Estamos a falar de módulos que incluem um conjunto de funções utilitárias que facilitam o processamento e a manipulação de sequencias de dados, funções como : o map o filter Entre outras É um conceito que existe desde os primórdios do LISP em 1958 e desde então que a maioria das linguagens inclui módulos com este tipo de funções.
  4. Por exemplo em .Net temos o Linq Em Java as Streams E em Javascript temos os arrays.
  5. Apesar disso, em cada linguagem surgem bastantes alternativas aos módulos standard, por exemplo: Em .Net temos o LinqFaster, o StructLinq, o Hyperlinq entre outros, Em Java temos o Jool, o Vavr, o StreamEx, etc E em Javascript temos entre outras, o Lodash, o Underscore e o Lazy.js
  6. Isto leva-nos a algumas questões, nomeadamente: Porquê tantas bibliotecas? Quais as diferenças entre elas? E qual escolher? Para responder, primeiro temos de perceber quais as propriedades dos módulos standard. Por exemplo:
  7. O Linq e a Stream são de natureza Lazy, já os Arrays são Eager
  8. O Linq e os Arrays têm flows de pull já a Stream do Java tem um flow de push
  9. A nível de extensibilidade, para adicionar novas operações em .Net usamos o yield, em Java implementamos uma nova classe e em Javascript estendemos o protótipo do objeto.
  10. Destes 3 módulos o único que é transparente é o de Javascript, em que a extensão do protótipo não tem mais nenhuma transformação associada. Em .Net o yield é traduzido pelo compilador numa maquina de estados complexa que equivale ao gerador escrito pelo programador. E em Java a operação é implementada através dum Spliterator, que por sua vez é envolvido numa nova Stream que se traduz num ReferencePipeline com ligações encadeadas por cada operação, usando um conceito de Sink para passar os elementos à operação seguinte.
  11. Na solução Tinyield adotei como requisitos as properiedades
  12. Lazy, para evitar o processamento desnecessário associado a processar cada operação de forma eager.
  13. Push flow, por forma a tornar as extensões à API mais concisas
  14. Extensão yield like, não fazendo uso do yield claro, mas tirando partido da semântica e da forma compacta como se adicionam operações com o mesmo.
  15. E Transparência, não necessitando de tradução do código das extensões para o engine da travessia da sequencia.
  16. Ao mesmo tempo, quis descartar soluções que resultassem em traduções complexas das extensões user-defined. Como é o caso do Java em que se faz Wrap ao código num ReferencePipeline, como acabei de dizer, torna-se pouco claro para o programador o que está a acontecer.
  17. Gerar maquinas de estado complexas. Como é o caso do .Net, ao usar yield. Em que o código que o programador escreve se traduz numa maquina de estados que pouco se assemelha ao código que escreveu.
  18. E ainda assim, com todos estes requisitos, sem que a solução tenha perdas no desempenho, para que seja uma solução viável para um leque alargado de use-cases
  19. Então e quais são as características do yield?
  20. Comecemos por olhar para um exemplo em Javascript duma função geradora da Sequência de Fibonacci.
  21. As funções geradoras, também chamados de geradores, são identificadas pelo asterisco depois da keyword function e só nestas funções é possível usar a keyword yield, caso contrario a utilização resulta num erro. O function* é o caso de Javascript, linguagens diferentes têm abordagens diferentes claro, por exemplo em C# é identificado pelo Tipo de Retorno IEnumerable.
  22. O termo Gerador refere-se a computações que produzem valores.
  23. O argumento do operador yield torna-se num output do gerador
  24. Referimo-nos a estes outputs como “yielded values”, em português, valores produzidos.
  25. Com isto conseguimos identificar que o yield é
  26. Delimitado. Só podemos usar o yield num âmbito que esteja delimitado por uma travessia.
  27. Estaticamente tipificado, ou seja, sabemos qual vai ser o tipo de retorno do gerador à partida mesmo em linguagens como javascript, o que garante maior confiança no programa.
  28. Comportam-se como objetos de primeira classe. Interage-se com eles para obter valores e para continuar a travessia da sequencia. E podem ser passados como parâmetro a outras funções ou geradores.
  29. E Stackful, ou seja, é possível que um gerador chame outro e mantenha o mesmo contexto de produção de valores.
  30. Olhando para outro exemplo em Javascript sobre esta ultima propriedade. Imaginemos que temos um mapa que representa uma hash table e cujos valores são arrays de items.
  31. Para percorrer cada elemento de cada array criamos o gerador flatten que itera cada valor do mapa, passando-o ao gerador list Que por sua vez itera o array que recebe por parâmetro e gera cada elemento iterado como output.
  32. A expressão yield asterisco no gerador flatten deixa-nos delegar a geração de valores a outro gerador, e assim por cada valor que list gera, flatten gera esse mesmo valor e apenas esse valor.
  33. Foi com base nesta Terminologia e nestas propriedades que surgiu a Proposta do Tinyield
  34. Começando pelo Yield. Nesta abordagem decidi tirar partido das funções de ordem superior para oferecer um idioma equivalente ao de geradores baseados em yield, sem necessitar de suporte para instrumentação destes operadores por parte do compilador. Esta interface é equivalente a um Consumer em Java, onde o método “accept” se chama “ret”, aludindo a “return”.
  35. A Interface Traverser representa o protocolo de travessia em massa. Esta interface oferece um único método “traverse” que pode ser equiparado ao método “forEach” da Stream do Java. Usar esta interface é a forma mais eficiente de percorrer os resultados obtidos da sequencia, isto porque o método “traverse”só tem de passar elementos à instancia de Yield que recebe por parâmetro, só retornando depois de passar todos os resultados, ou seja, tem menos mudanças de contexto.
  36. A Interface Advancer representa o protocolo de travessia individual, ou passo a passo. Esta interface oferece também um único método “tryAdvance” que recebe por parâmetro uma instancia de Yield à qual vai passar o próximo resultado caso ele exista e retorna um booleano que indica se a travessia avançou ou se não existem mais resultados.
  37. Apesar da travessia em massa ser mais eficiente, a travessia passo a passo continua a ser necessária para certos use-cases, para se manter a propriedade lazy da sequencia, como na operação “Zip”. Esta operação recebe um tuplo de sequencias e combina-as numa sequencia de tuplos. Se só fosse possível fazer travessia em massa, tínhamos de manter um buffer de todos os elementos de cada sequencia e só depois combinar os mesmos numa nova sequencia. Isto tem uma panóplia de problemas, nomeadamente se uma sequencia for mais longa que a outra estamos a processar elementos desnecessariamente, ou se uma das sequencias for infinita o processo eventualmente iria crashar.
  38. As soluções para este problema passam por usar travessia individual como temos aqui no slide, usar travessia em massa com short-circuit, ou até ambas como irei mostrar mais à frente.
  39. A classe Query agrupa as interfaces Advancer e Traverser, é a representação de sequencia oferecida pela solução Tinyield.
  40. O conceito é simples, segue os mesmos princípios do padrão Collection Pipeline, ou seja, é composta por uma fonte de dados, uma ou mais operações intermédias e uma operação terminal.
  41. Oferece, como era de esperar, um conjunto de funções utilitárias, como o map, filter, reduce, zip, etc.
  42. Mas o que distingue a solução Tinyield das outras soluções é a sua forma simples e fluente de acrescentar operações à API, ao mesmo tempo que dá primazia ao protocolo de iteração mais eficiente, travessia em massa, fazendo com tenha melhor desempenho na maioria dos use-cases quando comparado com os módulos standard de cada linguagem.
  43. Um desafio desta solução, foi a forma de fazer curto-circuito da travessia. Isto porque, dando primazia ao protocolo de iteração mais eficiente, existe a possibilidade de não haver travessia individual definida, mas ainda assim, tudo deve funcionar normalmente.
  44. Para resolver este problema foi criado um método estático “bye” na interface Yield, que lança a mesma exceção leve TraversalFinishError para fazer um curto-circuito à travessia em massa.
  45. Para completar foi definido também o método “shortCicuit” na classe Query que faz uma travessia em massa mas está preparado para que no caso de uma exceção TraversalFinishError seja lançada, terminar a travessia imediatamente e retornar.
  46. O outro desafio foi a extensibilidade. Para não limitar o programador às operações oferecidas pela biblioteca, é necessário disponibilizar formas de estender a API da mesma.
  47. Para esse efeito a solução Tinyield oferece o método “then” que permite aos programadores definirem operações custom de forma fluente. Para o fazer apenas têm de definir um Traverser a partir da Query “Upstream”, ou seja, que define a sequencia até ao uso do método “then”. Esta forma de extensão não cobre todos os casos, nomeadamente casos em que seja necessário travessia individual e para tal o “then” tem um overload que permite definir ambos os tipos de travessia.
  48. É de salientar o quão concisa esta forma de extensão consegue ser quando a comparamos a outras formas de estender este tipo de APIs . Olhando para o caso da Stream do Java e comparando com o Tinyield conseguimos ver rapidamente a diferença. Imaginando que o Tinyield não oferece a operação zip, se a quiséssemos adicionar, teríamos um troço de código de cerca de 10 linhas sendo que 3 delas são declarações de variaveis, já para adicionar a mesma operação à Stream do Java escrevemos 36 linhas.
  49. Voltando ao exemplo do list e flatten que vimos antes em Javascript e comparando com a solução para o mesmo problema usando o Tinyield em C#, vemos que:
  50. Cada lambda retornada delimita o âmbito do gerador e captura os seus parâmetros, representando um closure.
  51. Estas implementações não precisam de instrumentação da parte do compilador nem de nenhum tipo de primitiva especial como o yield
  52. É ainda de salientar que o Yield na solução Tinyield é uma instancia da Interface Yield e não uma keyword especial, e que a forma de delegar o contexto de geração de elementos é passando a instancia de yield ao gerador seguinte como vemos na chamada ao list, o que torna a solução, Stackful.
  53. Para conseguir validar quais as alternativas mais e menos eficientes fui à procura de benchmarks que fizessem estas comparações.
  54. No entanto deparamei-me com uma ausência de benchmarks que o fizessem, principalmente benchmarks com use-cases de relevo.
  55. O único que encontrei com algo que achei relevante foram os benchmarks do Kotlin, dos quais ainda retirei algumas ideias, mas ainda assim os use-cases eram muito simples.
  56. Decidi então criar um conjunto de benchmarks tanto com use-cases simples, como com use-cases complexos onde se utilizam operações personalizadas para que ilustrassem melhor o panorama do mundo real.
  57. Um dos sítios onde me inspirei foi numa pergunta do StackOverflow que evidenciava não só a ausência da operação Zip na Stream do Java mas também como a sua adição era verbosa e como perdia a fluência do pipeline.
  58. O autor precisava do Zip para duas outras operações, Every e Find, e com isto em mente decidi criar dois benchmarks que testavam a performance de adicionar a operação zip assim como o uso da mesma nestas operações.
  59. Nos resultados obtidos para o Every em sequencias de 1000 elementos, conseguimos ver que tanto em Java como em Javascript a solução Tinyield tem vantagem em performance ou no mínimo é equiparável às melhores alternativas. Em Java o Vavr é de longe o menos eficiente, sendo que a performance da maior parte das alternativas é equiparável, as que se destacam com melhor performance são a Sequence do Kotlin, o Eclipse Collections e o Tinyield. Em Typescript o IxJs é a opção menos eficiente, seguida do Underscore e do Sequency. O Lodash, O Lazy.js e os Arrays ES6 são bastante mais eficientes, juntamente com o Tinyield.
  60. Já em relação aos resultados do Find, em Java a Sequence do Kotlin é muito superior neste use-case e o Vavr muito inferior, o resto das soluções são mais comparáveis umas às outras, ainda assim o Tinyield não é das melhores soluções. Já em Typescript o Tinyield é a melhor solução para sequencias de números ou strings e o Lazy.js é melhor para classes. Por outro lado o Underscore e o IxJs são as alternativas com pior desempenho.
  61. É também de salientar que para sequencias maiores o panorama muda, e temos as soluções Lazy claramente com melhor desempenho do que as Eager, o que faz sentido. Porque as operações Eager primeiro vão executar o zip para todos os elementos e só depois vão executar o findFirst() o que resulta em bastante processamento desnecessário.
  62. Para não ficar limitado a use-cases com dados fabricados decidi procurar APIs que fornecessem dados reais, a partir dos quais pudesse desenhar use-cases que fizessem sentido no mundo real. Encontrei 3 APIs, Rest Countries, Last.fm e World Weather Online.
  63. Combinando os dados da API Last.fm e Rest Countries desenhei 2 benchmarks: Distinct Top Artist and Top Track by Country Que calcula as combinações de: País Melhor artista do País E Melhor musica do País Sem repetir o artista em mais do que um tuplo. E o Artists who are in a Country’s top ten who also have Tracks in the same Country’s top ten que emparelha o País e uma listagem de artistas que está no top 10 desse país e tem também musicas no top 10 do mesmo país.
  64. Já com recurso à API do World Weather Online desenhei 3 outros benchmarks: Query Max Temperature que encontra a temperatura mais elevada Query Temperature Transitions que conta o numero de transições de temperaturas de dia pra dia. E Query Distinct Temperatures que conta o numero de temperaturas distintas no conjunto de dados analisado Nestes benchmarks fazemos uso de operações custom, como a oddLines, em conjunto com dados obtidos de fontes reais.
  65. Para o Benchmark Query Distinct Temperatures a solução mais eficiente é o Tinyield, seguido de perto pela Stream e pelo Jool em Java e pelos Arrays Es6 e o Lazy.js em Typescript. Em Java as piores soluções são o VAVR e o StreamEx e em Typescript são o Sequency e o IxJs.
  66. Outro benchmark que só me ocorreu mais tarde é um algoritmo clássico, o Same Fringe, que dadas duas àrvores
  67. Valida se as Franjas de ambas são iguais. Este algoritmo é interessante neste caso, porque a computação das folhas é um processo pesado e para além disto o algoritmo faz uso da operação zip que como já vimos, em Java é uma operação custom.
  68. No que toca a resultados, o Tinyield tem melhor performance para este algoritmo tanto em Java como em Javascript e em .Net. Em Java tanto a Sequence do Kotlin como o Vavr são as alternativas com pior performance, Já no resto das linguagens as alternativas são muito idênticas entre si, com excepção do Sequency em Javascript que também tem boa performance.
  69. Concluindo. A ideia do yield nasce das corotinas. O Tinyield é a primeira proposta, independente das corotinas, que consegue ser: Compacto na adição de novas operações Eficiente a processar sequencias de dados, como demonstramos num conjunto de benchmarks. E transparente, ou seja, traduzido diretamente no mecanismo interno de Traversal, sem wrappers auxiliares nem maquinas de estado.
  70. Algumas validações deste trabalho são os múltiplos repositórios Github, nomeadamente:
  71. Um repositório para a solução Tinyield por linguagem, foram feitos para Java, Typescript e .Net
  72. Repositórios com benchmarks e a sua analise também por cada linguagem, novamente Java, Javascript e .Net
  73. Um Repositório com benchmarks que testam os ganhos de performance das parallel streams e a sua analise
  74. E ainda um repositório para um wrapper fluente ao Sequence do Kotlin para Java, com 2 repositórios de exemplos de utilização. Sendo que alguns destes projetos já têm alguns seguidores, nomeadamente o Jayield, que é o nome do Tinyield para Java, que tem 9 estrelas e o Sek, que é o Wrapper Java para as Sequencias Kotlin, que já tem 5, não é muito, mas são alguns.
  75. Uma publicação na Dzone que teve mais de 20 mil visualizações, onde respondi a uma pergunta do StackOverflow que evidenciava a falta de uma operação Zip à stream do Java. Esta publicação mostra várias possíveis soluções e demonstra o desempenho de cada uma através de um conjunto de benchmarks.
  76. Uma publicação na InfoQ sobre como a Sequence do Kotlin é uma alternativa viável à Stream do Java, sendo mais fácil de estender a sua API, com melhor desempenho e, usando um projeto desenvolvido neste âmbito, sem perder a fluência do pipeline.
  77. E finalmente um Artigo na 16ª Edição da International Conference on Software Technologies, onde exploro as propriedades do yield e a forma como se podem aproveitar as mesmas para trazer mais transparência ao programador, como evidenciei também ao longo desta apresentação.
  78. Em relação ao trabalho futuro: O facto da extensão da API da solução Tinyield ser feito através do protocolo de iteração em bulk, faz com que não haja tradução direta para a iteração elemento a elemento. Ao dia de hoje é necessário que o programador defina um Advancer, o que por um lado é mais transparente, mas por outro leva a mais esforço por parte do programador. Uma solução para este problema seria gerar esse código através de uma biblioteca de manipulação de bytecode como é o caso da ASM.
  79. Em relação às parallel streams. Apesar de ter ficado com a ideia de que são pouco eficientes na grande maioria dos use-cases, os use-cases que tenho podem não ser suficientes para se tirar conclusões fortes. Existe alguma convicção na pouca eficácia destas features por parte da comunidade, como é evidenciado em alguns artigos nomeadamente no artigo “A Java™ Parallel Calamity” do Edward Harned, mas ainda assim, este tópico poderia ser melhor testado.
  80. E isto leva-me ao meu ultimo ponto. Aprofundar este estudo, tanto a nível dos parallel streams que poderiam ter mais benchmarks para recolher mais dados. Mas também como na tradução do Tinyield para outras linguagens como Python ou Go por exemplo, assim como desenvolver benchmarks para estas linguagens e acrescentar às que já temos.
  81. E com isto dou por terminada a minha apresentação, espero ter sido claro e que tenha sido útil. Muito obrigado!